【问题标题】:Why is the value in a not affected by the change in b? [duplicate]为什么a中的值不受b变化的影响? [复制]
【发布时间】:2021-02-16 01:15:03
【问题描述】:

在下面的程序中,如果 a 引用 b 中的值,而 b 引用 0 中的值,那么最终 a 取决于b 指的是a = b 的值,对吗?所以使用这个类比,如果我更改b 存储的值,那么最终a 应该引用相同的值 b 的值也是如此,但是当我进行这些更改时,我没有得到预期的结果,即 a 中的值不受影响,那么我在哪里误解了?

a = b = 0   
print(a, b)   
b = 1   
print(a, b)

但是,如果我重新编写程序:

a = b = []
print(a, b)
b.append(1)
print(a, b)

然后我们看到a的值随着b的变化而显着变化,为什么?

【问题讨论】:

  • 推荐阅读:nedbatchelder.com/text/names.html。在您的第二个示例中,a 的值 没有 改变。
  • @AvenDesta 类型无关。两个示例的工作原理相同
  • “那么我们看到a的值随着b的变化而显着变化,为什么?”不,它没有
  • @MalikEbadUllah 完全不同。 .append 是 mutator 方法,简单赋值不是。
  • @MalikEbadUllah 为什么会这样? a = b 不会“链接”变量a = <some expression> 只是将<some expression> 求值的对象分配给a。您只是引用另一个变量作为表达式这一事实并不重要。你从未重新分配a。它仍然引用您上次告诉它引用的对象,并将继续引用,直到您重新分配它。阅读nedbatchelder.com/text/names.html

标签: python


【解决方案1】:

因为整数是不可变的。当您重新分配一个时,您不会更改 ab 指向的对象,而是让 b 引用不同的对象。

试试这个变体:

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

【讨论】:

  • 可变性无关紧要。简单的赋值(就像在问题中一样)永远不会改变,上面的两个例子都是一样的
  • 这与ab 是数字或列表无关。这“当您重新分配一个时,您不会更改 a 和 b 指向的对象,而是让 b 引用不同的对象。” 适用于所有类型。
  • @MarkRansom 不,变量赋值永远不可能改变两个变量。您在谈论项目分配,它只是对某个钩子的调用,最终 (__setitem__) 可以产生任意效果。您的陈述,“因为整数是不可变的。当您重新分配一个时,您不会更改 a 和 b 指向的对象,而是让 b 引用不同的对象。”强烈暗示对于可变对象,重新分配变量改变,就像OP的原始文本错误地暗示了
  • @MarkRansom 可变对象可以改变,变量赋值永远不会改变a = b从不变异,无论类型如何。
  • 问题 “为什么 a 中的值不受 b 变化的影响?” 与数字无关,因为 OP 用错误的列表示例错误地证明:@ 987654321@
猜你喜欢
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2020-05-02
  • 2022-12-12
  • 2019-10-27
  • 2011-08-10
  • 1970-01-01
相关资源
最近更新 更多