蟒蛇使局部类变量,全局如果使用list.append(X),但如果列表= X [复制]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蟒蛇使局部类变量,全局如果使用list.append(X),但如果列表= X [复制]相关的知识,希望对你有一定的参考价值。
这个问题已经在这里有一个答案:
对象列表是全球性的,如果追加,但如果列表=值
我创建了一个类,它接受一个列表,并使用它的数学函数。不管怎么说,我注意到系统一个奇怪的怪癖:如果我追加元素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=foo
list=[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 = foo
x = [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)
另一答案
你误会了什么类属性和实例属性。在第一个例子中,你已经声明Wrong.list
因为这将跨越Wrong
的所有实例共享的类属性。在第二个例子中,你已经创建Right
的一个实例,然后替换它的参照类属性Right.list
一个新的参考的命名self.list
实例属性。访问属性时,查找层次是这样的:
- 请求属性
<name>
。 - 检查的实例属性存在
<name>
。如果是的话,返回。 - 如果没有实例属性中找到,检查是否存在
<name>
类属性。如果是的话,返回。 - 返回AttributeError的,因为这种情况下没有命名的属性。
这不是它的错误做任何事情,那就是你没有完全跟随它在做什么你。
以上是关于蟒蛇使局部类变量,全局如果使用list.append(X),但如果列表= X [复制]的主要内容,如果未能解决你的问题,请参考以下文章