Python 多重赋值和引用

Python multiple assignment and references

为什么多重赋值对整数而不是列表或其他对象进行不同的引用?

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

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

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

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

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

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

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

CPython implementation detail: This is the address of the object in memory.

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

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

但是,即使您对两者都执行 +=,您也不一定会看到相同的结果,因为 += 的作用取决于您使用它的类型。

这就是基本的答案:像 += 这样的操作在不同的类型上可能会有不同的效果。 += returns 新对象或修改现有对象是由该对象定义的行为。要知道行为是什么,您需要知道它是什么类型的对象以及它定义了什么行为(即文档)。更重要的是,您不能假设使用 += 这样的操作与使用 .append 这样的方法会产生相同的结果。 .append 之类的方法的作用由调用它的对象定义。

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

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

但不可变对象恰恰相反,它会创建一个新的space并将自己转移到那里

即)

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'

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

像wise making A=B=1 和改变A A=2 会创建一个新的内存space和变量A会引用该位置,这就是为什么在更改 A

的值时 B 的值不会更改的原因

但在 List 中情况并非如此,因为它是一个可变对象,更改值不会将其转移到新的内存位置,它只会扩展已使用的内存

即)

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

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