2014-07-26 80 views
0

我想了解什麼時候在Python中複製對象。何時在Python中複製對象?

最簡單的情況下明確的副本,例如:

A = [ 1,2,3 ] 
B = list(A) # this is a copy of A 

是否有含蓄地複製對象的場景?例如,一些使用「按值傳遞」的語言將複製用作函數參數的對象(我知道Python中並非如此)。 Python中是否存在這樣的隱式拷貝示例?

+4

沒有項目在Python中被隱式複製。 –

回答

-1

實際上,任何不可變對象的間接賦值都可以被認爲是一個副本。例如:

a = "abc" 
b = a 
a += "def" 
print b 
--> "abc" 

從技術上講,沒有複製發生。當你添加到a時,實際上你正在創建一個新的對象,並賦值變量名「a」,而變量「b」繼續引用原始字符串。

就功能而言,傳遞變量中不會發生複製;然而,相同的規則適用於可變參數和不可變參數。如果您要傳遞不可變對象,則任何更改只會影響本地「複製」。

+0

如何?如果OP詢問關於pass-by-copy,我會認爲可變性和內部變量賦值是一個自然的擴展,因爲它是(IMO)Python和允許顯式指針的語言之間的關鍵區別之一。 。 控制。 – AMacK

-2

list()在你的例子中沒有做任何特殊的事情。

list(iterable)

返回其項目相同,並且在同一順序 可迭代的項目清單。可迭代可以是序列,支持迭代的容器或迭代器對象。如果可迭代已經是一個 列表,則會創建並返回一個副本,類似於iterable [:]。對於 實例,list('abc')返回['a','b','c']和列表((1,2,3)) 返回[1,2,3]。如果沒有給出參數,則返回一個新的空列表, []。

+1

確實如此,但它確實證明了OP所描述的內容。 B現在引用與A的列表分開的列表。 – AMacK

0

希望這將更好地說明什麼是你的代碼發生的事情:

>>> a = object() 
>>> b = object() 
>>> A = [a, b] 
>>> B = list(A) 
>>> A 
[<object object at 0x1002b7090>, <object object at 0x1002b70a0>] 
>>> B 
[<object object at 0x1002b7090>, <object object at 0x1002b70a0>] 
>>> A is B 
False 

你能看到的是list()實際上創建基於A.列表的新實例,這就是爲什麼A is B返回false。然而這兩個列表的內容完全相同