Python面向对象编程中实例和类的可变性

4

我一直在阅读一些内容,思考这段代码:

def change(c, n: int) -> None:
    c.x = n


class Value:
    x = 5


m = Value()
change(Value, 3)
print(m.x)
change(m, 1)
change(Value, 2)
print(m.x)


这段代码的输出结果是:
  • 3
  • 1
因此,我认为对于数字3,m和Value是别名,但更改m的属性会破坏这种关系。通过运行id()无法确认这一点 - 结果发现m和value始终具有不同的id。
有人能解释一下发生了什么吗?

4
输出结果为 3 1,而非 3 2 - Guy
1
你混淆了类和实例属性。它们的行为不同。 - Klaus D.
1个回答

3

当你改变Value的值时,你实际上是改变了所有value实例所共享的x值。

而当你改变m的值时,你只是为m本身做出改变,实际上是用一个新的实例 x来覆盖类x。你可以通过下列代码看到:

k = Value()
print(k.x) # 2

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