Python - 类的可变性

3
我从一次考试中得到了下面的代码,但我不明白为什么第一次执行 f2 = f1 时,执行 f1.set() 会改变 f2 的值,但之后当你执行 f1 = Foo("Nine", "Ten") 时,却不会对 f2 产生影响。如果有人知道原因,请解释一下。谢谢!
class Foo():
    def __init__(self, x=1, y=2, z=3):
        self.nums = [x, y, z]

    def __str__(self):
        return str(self.nums)

    def set(self, x):
        self.nums = x

f1 = Foo()
f2 = Foo("One", "Two")

f2 = f1
f1.set(["Four", "Five", "Six"])
print f1
print f2

f1 = Foo("Nine", "Ten")
print f1
print f2

f1.set(["Eleven", "Twelve"])
print f1
print f2

结果:

['Four', 'Five', 'Six']
['Four', 'Five', 'Six']
['Nine', 'Ten', 3]
['Four', 'Five', 'Six']
['Eleven', 'Twelve']
['Four', 'Five', 'Six']

3
你现在正在参加考试吗? - Woot4Moo
1
这篇我以前的回答有帮助吗?Python列表不反映变量更改,对Python新手来说 - Martijn Pieters
2
尝试在Python Tutor的可视化器中运行此代码。 - Marius
1个回答

5
f2 = f1

在该语句执行后,f1f2都引用了同一个Foo实例。因此,对其中一个的更改将影响另一个。

f1 = Foo("Nine", "Ten")

接下来,f1 被分配给一个 新的 Foo 实例,因此 f1f2 不再有任何联系 - 因此一个实例的更改将不会影响另一个实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接