我正在寻找合适的术语来描述集合对象的这一众所周知的属性,更重要的是,当使用变量引用其元素时堆栈图的变化方式:
>>> x = 5
>>> l = [x]
>>> x += 1
>>> l
[5]
>>> x
6
列表对变量 x 所做的操作的名称是什么,以防止它被绑定(bind)到对 x 原始值的任何更改?屏蔽?共享结构?列表绑定(bind)?使用这些术语的 Google 搜索没有返回任何结果。
这是一个更详细的示例(不幸的是,没有定义)。
归功于 ocw.mit.edu
请您参考如下方法:
What is the name of what the list is doing to the variable x to prevent it from being bound to any changes to the original value of x? Shielding? Shared structure? List binding? Nothing is coming back from a Google search using those terms.
因为列表没有做任何事情,而且它不是集合的属性。
在 Python 中,变量就是名称。
>>> x = 5
这意味着:x 应该是值 5 的名称。
>>> l = [x]
这意味着:l 应是取x 命名的值 (5) 的结果的名称,并使具有该值的单元素列表 ([5])。
>>> x += 1
x += 1 在这里被重写为 x = x + 1,因为整数是不可变的。您不能使值 5 增加 1,因为那样它就不再是 5。
因此,这意味着:x 不再是它当前命名的名称,而是开始作为数学表达式 x + 1 产生的值的名称>。即,6。
引用语义就是这样发生的。没有理由期望列表的内容会发生变化。
现在,让我们看看值语义会发生什么,在一种看起来像 Python 但对待变量的方式与在 C 中相同的假设语言中。
>>> x = 5
现在这意味着:x 是一 block 内存的标签,其中包含数字 5 的表示。
>>> l = [x]
现在这意味着:l 是一 block 内存的标签,它包含一些列表结构(可能包括一些指针等),它将以某种方式初始化,以便它表示一个列表有 1 个元素,其值为 5(从 x 变量复制)。它不能在逻辑上包含 x,因为它是一个单独的变量并且我们有值语义;所以我们存储一个副本。
>>> x += 1
现在这意味着:增加 x 变量中的数字;现在是 6。该列表同样不受影响。
无论您的语义如何,您都不能以这种方式影响列表内容。期望列表内容发生变化意味着您的解释不一致。 (如果将代码重写为 l = [5]; x = l[0]; x += 1,这将变得更加明显。)
