根据Python教程,9.2。 Python范围和命名空间:
分配不会复制数据 - 它们只是将名称绑定到对象。
所以我很惊讶以下代码并不让我感到惊讶:
>>> a = 42
>>> b = a
>>> b = b / 2
>>> a
42
>>> b
21
如果作业b = a
仅将名称b
绑定到已int
绑定的42
对象a
,则不应该执行a
后,21
为b = b / 2
,因为a
和b
是指同一个对象?
答案 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
创建新值。