>>> class Abcd:
... a = ''
... menu = ['a', 'b', 'c']
...
>>> a = Abcd()
>>> b = Abcd()
>>> a.a = 'a'
>>> b.a = 'b'
>>> a.a
'a'
>>> b.a
'b'
这一切都是正确的,每个对象都有自己的'a',但是......
>>> a.menu.pop()
'c'
>>> a.menu
['a', 'b']
>>> b.menu
['a', 'b']
怎么会发生这种情况? 以及如何使用list作为类属性?
答案 0 :(得分:7)
这是因为您初始化menu
属性的方式是将所有实例设置为指向相同的列表,而不是具有相同值的不同列表。
相反,使用类的__init__
成员函数初始化值,从而创建一个新列表并将该列表分配给该类的特定实例的属性:
class Abcd:
def __init__(self):
self.a = ''
self.menu = ['a', 'b', 'c']
答案 1 :(得分:4)
请参阅教程中的class-objects,并注意使用self
。
使用实例属性,而不是类属性(以及新样式类):
>>> class Abcd(object):
... def __init__(self):
... self.a = ''
... self.menu = ['a','b','c']
...
>>> a=Abcd()
>>> b=Abcd()
>>> a.a='a'
>>> b.a='b'
>>> a.a
'a'
>>> b.a
'b'
>>> a.menu.pop()
'c'
>>> a.menu
['a', 'b']
>>> b.menu
['a', 'b', 'c']
>>>
答案 2 :(得分:0)
因为Python中的变量只是“标签”
Abcd.menu和a.menu都引用相同的列表对象。
在您的情况下,您应该将标签分配给新对象
不要在原地修改对象。
你可以运行
a.menu = a.menu[:-1]
而不是
a.menu.pop()
感受差异