"名称变量"和"存储变量"之间是否存在差异?

RxS*_*RxS 0 python variables

我已经听过并且到处都读到变量是Python中的"名称而不是存储",并且重要的是不要将它们视为存储,但我没有找到一个为什么重要的例子.所以问题是,为什么区分变量名称和变量是存储的重要性?

小智 6

a = SomeObject()
b = a
Run Code Online (Sandbox Code Playgroud)

如果名字是存储(因为它们是在C和C++,例如),则两个ab会从字面上包含每一个对象:

a +---------+
  | value 1 |
  +---------+

b +---------+
  | value 2 |
  +---------+
Run Code Online (Sandbox Code Playgroud)

因此,例如,a.x = ...将对值1进行操作,而值2完全不受影响.请注意,那些提供值的语言允许操纵一个值(例如指针).但是,这与本主题无关,您可以在Python的模型中执行类似的操作.

在Python和类似语言中,内存看起来更像是这样的:

a +-------------+
  | reference 1 | ---------+
  +-------------+          v
                      +---------+
                      | value 1 |
                      +---------+
b +-------------+          ^
  | reference 2 | ---------+
  +-------------+
Run Code Online (Sandbox Code Playgroud)

这里引用的是一个虚构的标记,它引用(duh!)对象.对任何对象都可以有任意数量的引用,对象不知道它们中的任何对象,如果没有对它的引用,对象仍然可以徘徊.另请注意,变量不是弹出引用的唯一位置 - 列表包含引用,dicts包含引用,对象的属性包含引用等.它有点像C中的指针,除了它不是可辨别的值,更别说对象,在语言中(因此也没有等效于指针算术).

最明显的后果是变量可以是别名,因此value #1通过另一个变量可以看到变体:

a.something = 1
b.something = 2
assert a.something == 2
Run Code Online (Sandbox Code Playgroud)

重新赋值变量不是值1的变异,只是改变了引用.换句话说,a = ...不影响b,反之亦然!