赋值只是将名称绑定到对象?

时间:2016-07-18 14:44:28

标签: python python-2.7 reference namespaces

根据Python教程,9.2。 Python范围和命名空间:

  

分配不会复制数据 - 它们只是将名称绑定到对象。

所以我很惊讶以下代码并不让我感到惊讶:

>>> a = 42
>>> b = a
>>> b = b / 2
>>> a
42
>>> b
21

如果作业b = a仅将名称b绑定到已int绑定的42对象a,则不应该执行a后,21b = b / 2,因为ab是指同一个对象?

3 个答案:

答案 0 :(得分:3)

好吧,你确实要对b进行另一项任务:

b = b / 2

由于对int(不可变)类型的操作将始终返回一个新对象,因此不会对原始值进行任何更改操作。

对于可以在某些操作中更改的可变类型,这是不同的,即扩充分配操作是在适当的位置进行的更改:

>>> a = [20]
>>> b = a
>>> b += [1]
>>> b
[20, 1]
>>> a 
[20, 1]

当然,请注意,对于简单的赋值,这不会发生,对于int,名称是指新对象:

>>> b = b + [1]
>>> b
[20, 1, 1]
>>> a
[20, 1] 

答案 1 :(得分:2)

在b = b / 2之后,b是新对象

>>> a = 42
>>> id(a)
8006428
>>> b = a
>>> id(b)
8006428
>>> b = b/2
>>> id(b)
8006680

答案 2 :(得分:0)

以下是它的痕迹:

>>> a = 42
a = 42
b未定义

>>> b = a
a = 42
b = a

>>> b = b / 2
a = 42
b = 21

操作b = b / 2正在使用b创建一个新对象,该对象在时间点指向a。它不会更改a,只是通过涉及a的操作创建新值。现在,b不再引用a,而是使用a创建新值。