繁体   English   中英

蟒蛇。 奇怪的类属性行为

[英]Python. Strange class attributes behavior

>>> 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']

怎么会这样 以及如何使用列表作为类属性?

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

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

class Abcd:
    def __init__(self):
        self.a = ''
        self.menu = ['a', 'b', 'c']

请参阅本教程中的类对象 ,并注意使用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']
>>> 

因为Python中的变量只是“标签”

Abcd.menu和a.menu都引用同一个列表对象。

您应该将标签分配给新对象,

不就地修改对象。

你可以跑

a.menu = a.menu[:-1]

代替

a.menu.pop()

感受不同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM