• 一个关于对象引用容易错误的代码


    最好不要用 列表 作为参数,否则容易得到非预期的结果,如下代码。

    def add(a, b):
        a += b
        return a
    
    class Company:
        def __init__(self, name, staffs=[]):
            self.name = name
            self.staffs = staffs
        def add(self, staff_name):
            self.staffs.append(staff_name)
        def remove(self, staff_name):
            self.staffs.remove(staff_name)
    
    if __name__ == "__main__":
        com1 = Company("com1", ["bobby1", "bobby2"])
        com1.add("bobby3")
        com1.remove("bobby1")
        print (com1.staffs) 
    
        com2 = Company("com2")
        print ("默认参数值为: ", Company.__init__.__defaults__)
        com2.add("bobby")
        print(com2.staffs)
    
       
        com3 = Company("com3")
        print ("默认参数值为: ", Company.__init__.__defaults__)
        com3.add("bobby5")
        print (com2.staffs)
        print (com3.staffs)
        print (com2.staffs is com3.staffs)

    输出结果如下

    ['bobby2', 'bobby3']
    默认参数值为: ([],)
    ['bobby']
    默认参数值为 (['bobby'],) [
    'bobby', 'bobby5'] ['bobby', 'bobby5'] True
    说明:
    1)我们发现最后执行完后,com2.staffs和com3.staffs居然是同一个对象。
    2)原因是我们在声明com2和com3时都没有指明参数staffs,他们都会使用默认的参数staffs=[],变量staffs指向了相同的内存空间。
          此时python内部就会把com2.staffs和com3.staffs当成同一个对象来处理.
    3)我们可以使用Company.__init__.__defaults__查看默认的参数值是什么
     
     
    生命的意义在于奉献, 解决各种问题
  • 相关阅读:
    第10节--单行函数之数学函数
    第九节--单行函数之日期函数
    【译】什么是游戏开发实体系统框架(终)
    【译】什么是游戏开发实体系统框架(一)
    【译】游戏《实体系统框架》译文——序
    IDEA 快捷键
    Java学习笔记1
    Java面试题
    Java学习笔记——集合
    Java学习笔记——String类常用方法
  • 原文地址:https://www.cnblogs.com/regit/p/14611620.html
Copyright © 2020-2023  润新知