簡體   English   中英

什么時候在Python中復制對象?

[英]When are objects copied in Python?

我試圖了解何時在Python中復制對象。

最簡單的情況是顯式復制,例如:

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

是否存在隱式復制對象的方案? 例如,某些使用“按值傳遞”的語言將復制用作函數參數的對象(我知道Python中不是這種情況)。 Python中是否有這樣的隱式復制示例?

希望它將更好地說明代碼中正在發生的事情:

>>> 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創建一個list()的新實例。這就是為什么A is B返回false的原因。 但是兩個列表的內容是相同的

實際上,任何不可變對象的間接分配都可以視為副本。 例如:

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

從技術上講,沒有復制發生。 當添加到a時,實際上是在創建一個新對象並為其分配變量名稱“ a”,而變量“ b”繼續引用原始字符串。

就函數而言,傳遞的變量中不會發生復制。 但是,相同的規則適用於可變和不可變的參數。 如果要傳遞不可變的對象,則任何更改只會影響本地“副本”。

list()在您的示例中沒有做任何特別的事情。

列表(可迭代)

返回一個列表,該列表的項目與iterable的項目相同且順序相同。 iterable可以是序列,支持迭代的容器或迭代器對象。 如果iterable已經是列表,則復制並返回一個副本,類似於iterable [:]。 例如,list('abc')返回['a','b','c'],list((1、2、3))返回[1、2、3]。 如果未提供任何參數,則返回一個新的空列表[]。

暫無
暫無

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

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