【发布时间】:2018-06-04 21:15:32
【问题描述】:
看到如下代码:
class Super:
powers = 'no power'
def __init__(self, name):
self.name = name
def add_power(self, power):
self.powers = power
dog = Super('dog')
cat = Super('cat')
dog.add_power("bark")
print (dog.powers) # print bark
print (cat.powers) # print no power
看起来python的类变量对每个实例都是独立的,因为将dog实例的powers变量从无电源更改为bark不会影响cat实例的powers变量
但是,通过这样做:
class Super:
powers = ["no power"]
def __init__(self, name):
self.name = name
def add_power(self, power):
self.powers.append(power)
dog = Super('dog')
cat = Super('cat')
dog.add_power("bark")
print (dog.powers) # print ['no power', 'bark']
print (cat.powers) # print ['no power', 'bark'] # why cat.powers is also affected???
示例显示 powers 变量(这次是列表)是静态的,因为将元素附加到 dog 实例的 powers 也会影响 cat 实例的 powers。
我还尝试通过调用 add_power 将幂更改为 int 并将幂加 1,它们不会相互影响。所以我真的很困惑为什么将一个元素附加到一个作为类变量的列表会影响其他实例。
【问题讨论】:
-
区别在于顶部使用和替换类字符串,底部使用和附加类列表:只是因为你通过
dog在课程列表中添加了一些内容并不会使其不是课程列表。