【问题标题】:Variables don't update [closed]变量不更新[关闭]
【发布时间】:2021-10-06 07:56:01
【问题描述】:

我有这段代码:

a = 2
b = a
a = 3
print(b)

鉴于此,我预计 a 的值会变成 3。但是,当我执行代码时,会返回以下内容:

2

我的问题是,为什么不打印 3?在这种情况下变量不会更新吗?

【问题讨论】:

  • 赋值不会使两个变量等价,它只是将值从一个复制到另一个。
  • 它打印2,因为b2。如果您重新分配不同的变量,变量不会得到更新。必须链接到Ned Batchelder
  • @balmy 这与可变性无关。可变值也会发生同样的情况。
  • 您应该将赋值语句视为将名称标签附加到对象上,仅此而已.. 参见此处stackoverflow.com/a/42908412/674039
  • @Barmar 请不要在 Python 中赋值的任何解释中使用“复制”这个词 :)

标签: python


【解决方案1】:

您需要学会将“对象”的概念与“名称”区分开来。您的第一条语句创建一个整数对象,并将其绑定到名称a。您的第二个语句将同一对象绑定到名称 b。您的第三个语句创建一个值为 3 的新整数对象并将其绑定到名称 a。名称 b 仍绑定到旧对象。

赋值运算符总是创建一个新的对象绑定。将此与就地修改列表进行比较:

a = [1,2]
b = a
a[0] = 3
print(b)

产生[3,2],因为我们没有改变绑定。我们已经修改了两个名称都绑定到的单个列表对象。

我实际上写了一篇关于这个的文章,因为它是一个非常关键的概念: https://github.com/timrprobocom/documents/blob/main/UnderstandingPythonObjects.md

【讨论】:

  • 其实在CPython中这些小整数对象在解释器启动时就已经创建好了,不过这样基本是对的。
【解决方案2】:

它按预期工作。

  1. a = 2 --> 变量a保存值2。

  2. b = a --> 变量b保存变量a的值(即2)。

  3. a = 3 --> 变量a保存值3。

如果您更改对象内部的某些内容,则所有引用该对象的变量都会更改(因为它们都引用存储它的相同位置)。但是将新对象(在本例中为数字值)分配给变量不会更改任何其他变量。

=> b 仍然引用 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多