簡體   English   中英

Python多重分配和引用

[英]Python multiple assignment and references

為什么多重賦值為int而不是列表或其他對象提供不同的引用?

>>> 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]行為會有所不同,但這是另一個問題

基本類型是不可變的。 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

更改可變對象和不可變對象的值時,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]

兩者都給出相同的值,因為它引用了相同的內存空間,因此兩者相等

區別不在於多重分配,而在於您隨后如何處理對象。 使用int,您執行+= ,使用列表,則執行.append

但是,即使對兩者都使用+= ,也不一定會看到相同的結果,因為+=作用取決於所使用的類型。

因此,這是基本答案: +=類的操作在不同類型上可能會有所不同。 +=返回新對象還是修改現有對象是該對象定義的行為。 要知道行為是什么,您需要知道它是哪種對象以及它定義了什么行為(即文檔)。 而且,您不能假定使用+=類的操作與使用.append類的方法具有相同的結果。 .append這樣的方法的作用由調用它的對象定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM