Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Variable Assignment - Fatal编程技术网

Python多重赋值和引用

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

为什么多重赋值会对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+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和更改A
A=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]