python - 类可变性

标签 python class mutability

我从一次考试中得到了下面的代码,但我不明白为什么当你第一次做 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']

最佳答案

f2 = f1

在这条语句之后,f1f2 都是对 Foo相同实例的引用。因此,一个的改变会影响另一个。

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

在此之后,f1 被分配给一个 Foo 实例,所以 f1f2 不再以任何方式连接 - 因此其中一个的更改将不会影响另一个。

关于python - 类可变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13830550/

相关文章:

javascript - 如何在子类中使用 `super` 调用父类(super class)上的箭头函数

c++ - 创建一个带有静态成员容器的类,其中包含该类的所有实例?

rust - 如何从 Rust 中的 Fn 闭包内部更改变量?

python - pymssql utf8 : queries with back slash

python - 将多列融合为一列

Python 列表和生成

c++ - "Expected class-name"...析构函数实现中的问题

rust - 为什么在函数内部改变传递的选项不会传播到外部的选项?

swift - 如何将 $0 更改为可变的?

python - Matplotlib:更改绘图上两个 x 轴刻度线之间的距离