Python 多重赋值和引用
Posted
技术标签:
【中文标题】Python 多重赋值和引用【英文标题】:Python multiple assignment and references 【发布时间】:2015-09-18 01:43:22 【问题描述】:为什么多重赋值会对整数产生不同的引用,而不是列表或其他对象?
>>> a = b = 1
>>> a += 1
>>> a is b
>>> False
>>> a = b = [1]
>>> a.append(1)
>>> a is b
>>> True
【问题讨论】:
【参考方案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将引用该位置,这就是为什么在更改值时B的值不会改变一个
但在 List 中情况并非如此,因为它是一个可变对象,更改值不会将其转移到新的内存位置,它只会扩展已使用的内存
即)
a=b=[]
a.append(1)
print a
[1]
print b
[1]
两者都给出相同的值,因为它引用相同的内存空间,所以两者相等
【讨论】:
【参考方案2】:原始类型是不可变的。当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
【讨论】:
【参考方案3】:不同之处不在于多重分配,而在于您随后对对象所做的事情。使用 int,您执行 +=
,使用列表执行 .append
。
但是,即使您对两者都使用+=
,也不一定会看到相同的结果,因为+=
的作用取决于您使用的类型。
这就是基本答案:像+=
这样的操作在不同类型上的工作方式可能不同。 +=
是否返回新对象或修改现有对象是由该对象定义的行为。要知道行为是什么,您需要知道它是什么类型的对象以及它定义的行为(即文档)。更重要的是,您不能假设使用像+=
这样的操作会得到与使用像.append
这样的方法相同的结果。像.append
这样的方法的作用是由您调用它的对象定义的。
【讨论】:
【参考方案4】:在 int 示例中,您首先将同一对象分配给 a
和 b
,然后将 a
重新分配给另一个对象(a+1
的结果)。 a
现在指的是不同的对象。
在列表示例中,您将相同的对象分配给a
和b
,但您无需做任何更改。 append
仅更改列表对象的内部状态,而不更改其标识。因此它们保持不变。
如果您将a.append(1)
替换为a = a + [1]
,您最终会得到不同的对象,因为您再次将一个新对象(a+[1]
的结果)分配给a
。
请注意,a+=[1]
的行为会有所不同,但这是一个完整的 other question。
【讨论】:
以上是关于Python 多重赋值和引用的主要内容,如果未能解决你的问题,请参考以下文章