家资是何物,积帙列梁梠。这篇文章主要讲述蟒蛇使局部类变量,全局如果使用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
实例属性。访问属性时,查找层次是这样的:- 请求属性
< name>
。 - 检查的实例属性存在
< name>
。如果是的话,返回。 - 如果没有实例属性中找到,检查是否存在
< name>
类属性。如果是的话,返回。 - 返回AttributeError的,因为这种情况下没有命名的属性。
推荐阅读
- Google App Engine 302状态仅限生产中的任务队列
- Android应用程序崩溃在Android 8.0(谷歌Pixel XL)
- Android socket.IO中的Emit或Ack超时处理()
- 在Rmarkdown文档中调整嵌入式Shiny App的大小
- 如何在Shiny app中的仪表板主体中输出数据库表()
- 在内部服务器上设置Shiny app
- 从android externel文件夹编译源代码
- 新的App Server,DB服务器,间歇性半秒延迟
- Microsoft App认证流程