我想了解什麼時候在Python中複製對象。何時在Python中複製對象?
最簡單的情況下明確的副本,例如:
A = [ 1,2,3 ]
B = list(A) # this is a copy of A
是否有含蓄地複製對象的場景?例如,一些使用「按值傳遞」的語言將複製用作函數參數的對象(我知道Python中並非如此)。 Python中是否存在這樣的隱式拷貝示例?
我想了解什麼時候在Python中複製對象。何時在Python中複製對象?
最簡單的情況下明確的副本,例如:
A = [ 1,2,3 ]
B = list(A) # this is a copy of A
是否有含蓄地複製對象的場景?例如,一些使用「按值傳遞」的語言將複製用作函數參數的對象(我知道Python中並非如此)。 Python中是否存在這樣的隱式拷貝示例?
實際上,任何不可變對象的間接賦值都可以被認爲是一個副本。例如:
a = "abc"
b = a
a += "def"
print b
--> "abc"
從技術上講,沒有複製發生。當你添加到a時,實際上你正在創建一個新的對象,並賦值變量名「a」,而變量「b」繼續引用原始字符串。
就功能而言,傳遞變量中不會發生複製;然而,相同的規則適用於可變參數和不可變參數。如果您要傳遞不可變對象,則任何更改只會影響本地「複製」。
如何?如果OP詢問關於pass-by-copy,我會認爲可變性和內部變量賦值是一個自然的擴展,因爲它是(IMO)Python和允許顯式指針的語言之間的關鍵區別之一。 。 控制。 – AMacK
list()
在你的例子中沒有做任何特殊的事情。
返回其項目相同,並且在同一順序 可迭代的項目清單。可迭代可以是序列,支持迭代的容器或迭代器對象。如果可迭代已經是一個 列表,則會創建並返回一個副本,類似於iterable [:]。對於 實例,list('abc')返回['a','b','c']和列表((1,2,3)) 返回[1,2,3]。如果沒有給出參數,則返回一個新的空列表, []。
確實如此,但它確實證明了OP所描述的內容。 B現在引用與A的列表分開的列表。 – AMacK
希望這將更好地說明什麼是你的代碼發生的事情:
>>> 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。然而這兩個列表的內容完全相同
沒有項目在Python中被隱式複製。 –