Python多重赋值和引用
为什么多重赋值会对int进行不同的引用,而不是列表或其他对象Python多重赋值和引用,python,list,variable-assignment,Python,List,Variable Assignment,为什么多重赋值会对int进行不同的引用,而不是列表或其他对象 >>> a = b = 1 >>> a += 1 >>> a is b >>> False >>> a = b = [1] >>> a.append(1) >>> a is b >>> True 在int示例中,首先将同一对象分配给a和b,然后用另一个对象重新分配a(结果是a
>>> a = b = 1
>>> a += 1
>>> a is b
>>> False
>>> a = b = [1]
>>> a.append(1)
>>> a is b
>>> True
在int示例中,首先将同一对象分配给
a
和b
,然后用另一个对象重新分配a
(结果是a+1
)a
现在指的是另一个对象
在列表示例中,您将同一对象同时指定给a
和b
,但不做任何更改<代码>附加仅更改列表对象的内部状态,而不是其标识。因此,它们保持不变
如果将a.append(1)
替换为a=a+[1]
,则会得到不同的对象,因为您再次将一个新对象(a+[1]的结果)分配给a
请注意,
a+=[1]
的行为会有所不同,但这是一个整体。基本类型是不可变的。当a+=1
运行时,a
不再将内存位置称为b
:
CPython实现细节:这是内存中对象的地址
不同之处不在于多重赋值,而在于随后对对象所做的操作。使用int可以执行
+=
,使用列表可以执行.append
但是,即使对这两种方法都执行+=
,也不一定会看到相同的结果,因为+=
的作用取决于使用它的类型
这就是基本答案:像
+=
这样的操作在不同类型上的工作方式可能不同。+=
是返回新对象还是修改现有对象是该对象定义的行为。要知道行为是什么,您需要知道它是什么类型的对象以及它定义了什么行为(即文档)。更重要的是,您不能假设使用像+=
这样的操作将产生与使用像.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
当改变可变对象的值时,它不会创建一个新的内存空间,而只是改变创建它的内存空间
但对于不可变的对象来说恰恰相反,它创建了一个新的空间,并在那里传递自己
即。)
这将创建一个新的内存空间并在那里分配字符串
像明智地做出A=B=1和更改AA=2将创建一个新的内存空间,变量A将引用该位置,这就是为什么在更改A的值时B的值不会更改的原因
但列表中的情况并非如此,因为它是一个可变对象,更改值不会将其转移到新的内存位置,而只是扩展已使用的内存
i、 e.)
两者都给出了相同的值,因为它引用了相同的内存空间,所以两者相等
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=[]
a.append(1)
print a
[1]
print b
[1]