python编程中的一个经典错误之list引用

 请看下面代码

class User:
    def __init__(self, name, hobby=[]):
        self.name = name
        self.hobby = hobby

    def add_hobby(self, hobby):
        self.hobby.append(hobby)

    def remove_hobby(self, hobby):
        self.hobby.remove(hobby)

    def __str__(self):
        return self.name + ',' + '-'.join(self.hobby)


if __name__ == '__main__':
    u1 = User('小明')
    u1.add_hobby('足球')
    print(u1)  #小明,足球
    print(id(u1.hobby))  # 2074461954696

    u2 = User('小强')
    u2.add_hobby('美女')
    print(u2)  #小强,足球-美女
    print(u1)  #小明,足球-美女
    print(id(u2.hobby))  # 2074461954696

分析:

  我们创建了两个User对象,分别是u1,u2,但是我在修改u2的hobby属性时,却引起了u1对象hobby属性的改变

  其根本原因是因为创建u1,u2对象时,并没有传hobby这个list对象, 默认就空, 而且这个空还是全局唯一的,指向了同一块内存地址. 所以修改u2也会引起u1的变化,

  因此,我们在传参list时,要特殊注意.这是一个坑.

猜你喜欢

转载自www.cnblogs.com/z-qinfeng/p/12041332.html