Python多重赋值和引用

时间:2015-07-01 03:45:18

标签: python

为什么多个赋值对int有明确的引用,而不是列表或其他对象?

>>> a = b = 1
>>> a += 1
>>> a is b
>>>     False
>>> a = b = [1]
>>> a.append(1)
>>> a is b
>>>     True

4 个答案:

答案 0 :(得分:5)

在int示例中,首先将同一对象分配给ab,然后将a重新分配给另一个对象(a+1的结果)。 a现在指的是另一个对象。

在列表示例中,您将同一对象分配给ab,但是您没有做任何事情来改变它。 append仅更改列表对象的内部状态,而不是其标识。因此它们保持不变。

如果您将a.append(1)替换为a = a + [1],则会得到不同的对象,因为您再次将新对象(a+[1]的结果)分配给a

请注意,a+=[1]的行为会有所不同,但这是一个完整的other question

答案 1 :(得分:1)

原始类型是不可变的。运行a += 1时,a不再将内存位置称为b

https://docs.python.org/2/library/functions.html#id

  

CPython实现细节:这是内存中对象的地址。

In [1]:    a = b = 100000000000000000000000000000
           print id(a), id(b)
           print a is b
Out [1]:   4400387016 4400387016
           True

In [2]:    a += 1
           print id(a), id(b)
           print a is b
Out [2]:   4395695296 4400387016
           False

答案 2 :(得分:1)

Python在更改可变对象和不可变对象的值时的工作方式不同

不可变对象:

This are objects whose values which dose not after initialization  
i.e.)int,string,tuple

可变对象

This are objects whose values which can be  after initialization
i.e.)All other objects are mutable like dist,list and user defined object

当更改可变对象的值时,它不会创建新的内存空间并在那里传输它只会更改创建它的内存空间

但是对于不可变对象来说恰恰相反,它创建了一个新的空间并在那里自我转移

<强>即。)

s="awe"

s[0]="e"
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-9f16ce5bbc72> in <module>()
----> 1 s[0]="e"

TypeError: 'str' object does not support item assignment 

这是试图告诉你你可以改变字符串内存的值  你可以这样做

"e"+s[1:]
Out[20]: 'ewe'

这将创建一个新的内存空间并在那里分配字符串。

同样明智地制作A=B=1 并更改A A=2 会创建新的内存空间,而变量A将引用该位置,这就是为什么更改A

的值时,B的值不会更改

但是这不是List中的情况,因为它是一个可变对象,更改值不会将其传输到新的内存位置,只会扩展已用内存

即。)

a=b=[]
a.append(1)
print a    
[1]    
print b
[1]

两者都给出了相同的值,因为它引用了相同的内存空间,所以两者都相等

答案 3 :(得分:0)

差异不在于多重赋值,而在于您随后对对象执行的操作。使用int,您执行+=,并使用列表执行.append

但是,即使您同时执行+=,您也不会看到相同的结果,因为+=所做的取决于您使用它的类型。

这就是基本答案:像+=这样的操作可能在不同类型上有所不同。 +=是返回新对象还是修改现有对象是由该对象定义的行为。要知道行为是什么,您需要知道它是什么类型的对象以及它定义的行为(即文档)。此外,您不能假设使用+=之类的操作与使用.append之类的方法具有相同的结果。像.append这样的方法的作用是由你调用它的对象定义的。