蟒蛇.奇怪的类属性行为

Eug*_*ene 1 python attributes class

>>> class Abcd:

...     a = ''
...     menu = ['a', 'b', 'c']
... 
>>> a = Abcd()
>>> b = Abcd()
>>> a.a = 'a'
>>> b.a = 'b'
>>> a.a
'a'
>>> b.a
'b'
Run Code Online (Sandbox Code Playgroud)

这一切都是正确的,每个对象都有自己的'a',但......

>>> a.menu.pop()
'c'
>>> a.menu
['a', 'b']
>>> b.menu
['a', 'b']
Run Code Online (Sandbox Code Playgroud)

怎么会发生这种情况?以及如何使用list作为类属性?

Amb*_*ber 7

这是因为初始化menu属性的方式是将所有实例设置为指向相同的列表,而不是具有相同值的不同列表.

相反,使用类的__init__成员函数初始化值,从而创建一个新列表并将该列表分配给该类的特定实例的属性:

class Abcd:
    def __init__(self):
        self.a = ''
        self.menu = ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)