Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 赋值只是将名称绑定到对象?_Python_Python 2.7_Reference_Namespaces - Fatal编程技术网

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是新对象

根据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
>>> 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是的,没错。