Python 赋值只是将名称绑定到对象?
根据Python教程9.2。Python作用域和名称空间: 赋值不复制数据-它们只是将名称绑定到对象 所以我很惊讶下面的代码没有让我吃惊:Python 赋值只是将名称绑定到对象?,python,python-2.7,reference,namespaces,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,那么在执行b=b/2之后a不应该是21,因为a和b在b=b/2之后是指同一个对象,b是新对象
>>> a = 42
>>> b = a
>>> b = b / 2
>>> a
42
>>> b
21
如果赋值
b=a
只是将名称b
绑定到int
对象42
,而该对象已经绑定到a
,那么在执行b=b/2
之后a
不应该是21
,因为a
和b
在b=b/2之后是指同一个对象,b是新对象
>>> a = 42
>>> id(a)
8006428
>>> b = a
>>> id(b)
8006428
>>> b = b/2
>>> id(b)
8006680
嗯,你确实给
b
做了另一个作业:
b = b / 2
由于对int
(不可变)类型的操作将始终返回一个新对象,因此不会对原始值进行任何更改
这与在某些操作中可能发生变化的可变类型不同,即在发生变化时进行的增广赋值操作:
>>> a = [20]
>>> b = a
>>> b += [1]
>>> b
[20, 1]
>>> a
[20, 1]
当然,请注意,简单的赋值不会出现这种情况,对于int
s,名称指的是一个新对象:
>>> b = b + [1]
>>> b
[20, 1, 1]
>>> a
[20, 1]
以下是它的踪迹:
>>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
创建的新值。不,您已经使用了该名称。整数是不可变的。读一下:对象没有名称——名称有对象。@erip你是说一个对象可以有许多不同的名称,而一个名称只能引用一个对象?@sunqingyao是的,没错。