蟒蛇使局部类变量,全局如果使用list.append(X),但如果列表= X [复制]

家资是何物,积帙列梁梠。这篇文章主要讲述蟒蛇使局部类变量,全局如果使用list.append(X),但如果列表= X [复制]相关的知识,希望能为你提供帮助。
这个问题已经在这里有一个答案:

  • How to avoid having class data shared among instances? 8个回答
  • Python loop appending same object twice 1个回答
对象列表是全球性的,如果追加,但如果列表=值
我创建了一个类,它接受一个列表,并使用它的数学函数。不管怎么说,我注意到系统一个奇怪的怪癖:如果我追加元素x的列表,在类中的所有对象访问它,但如果我设置列表= X,比单是本地的。 X也是一个列表。
class Wrong: list=[]def __init__(self, foo): for i in foo: self.list.append(i)class Right: list=[]def __init__(self, foo): self.list=foolist=[1,2,3] wrong1 = Wrong(list) wrong2 = Wrong(list) right1 = Right(list) right2 = Right(list)print(wrong1.list) print(wrong2.list) print(right1.list) print(right2.list)

我期望的输出是一样的,但是在打印时,它的
[1, 2, 3, 1, 2, 3] [1, 2, 3, 1, 2, 3] [1, 2, 3] [1, 2, 3]

我使用python 3.7.2,在改变任何东西的情况下。
答案你只需要定义__init__函数内部列表:
class Wrong:def __init__(self, foo): self.y = [] for i in foo: self.y.append(i)class Right:def __init__(self, foo): self.z = foox = [1,2,3] wrong1 = Wrong(x) wrong2 = Wrong(x) right1 = Right(x) right2 = Right(x)print(wrong1.y) print(wrong2.y) print(right1.z) print(right2.z)

另一答案【蟒蛇使局部类变量,全局如果使用list.append(X),但如果列表= X [复制]】你误会了什么类属性和实例属性。在第一个例子中,你已经声明Wrong.list因为这将跨越Wrong的所有实例共享的类属性。在第二个例子中,你已经创建Right的一个实例,然后替换它的参照类属性Right.list一个新的参考的命名self.list实例属性。访问属性时,查找层次是这样的:
  1. 请求属性< name>
  2. 检查的实例属性存在< name> 。如果是的话,返回。
  3. 如果没有实例属性中找到,检查是否存在< name> 类属性。如果是的话,返回。
  4. 返回AttributeError的,因为这种情况下没有命名的属性。
这不是它的错误做任何事情,那就是你没有完全跟随它在做什么你。

    推荐阅读