簡體   English   中英

Python:為什么循環使用while循環中定義的列表,而不循環使用分配給列表的變量?

[英]Python: why are lists defined inside while loops recycled but not variables that are assigned lists inside same loop?

還是很新,我搜索了google,但是我並沒有真正找到解釋,因此在此先謝謝您。 在編寫Python時,為什么會這樣,為什么在while循環期間,可以修改在while循環之外分配了列表的變量,並在每次迭代時保留其修改,但是在循環期間分配了列表的變量會還原是每次迭代的原始分配? 這是示例代碼:

x = [1,1,1]

while True:
    a = [1,1,1]
    b = x
    a.append(1)
    b.append(2)
    print(a)
    print(b)

為什么變量a保持不變,而變量b可以附加到每個迭代中並保持其修改? 謝謝。

由於bx是對同一列表對象的引用,因此您的代碼等效於

x = [1,1,1]

while True:
    a = [1,1,1]
    a.append(1)
    x.append(2)
    print(a)
    print(x)

在循環的每次迭代中, x引用的列表都會獲得另一個元素。 a在每次迭代中都引用一個新的3元素列表,因此在丟棄之前,它永遠不會超過4個元素。 更容易查看是否展開(原始)循環:

x = [1,1,1]

a = [1,1,1]  # new list
b = x        # reference to old list
a.append(1)
b.append(2)
print(a)
print(b)

a = [1,1,1]  # new list
b = x        # reference to old list
a.append(1)
b.append(2)
print(a)
print(b)

...

您還可以添加一些對print(id(a))print(id(b))調用,以查看id(b)從不更改,而id(a)在每次迭代中都更改。 (由於垃圾收集器的工作方式, id(a)可能會在兩個不同的值之間來回振盪。)

這是因為a在每次迭代中都會重新定義,而b則不會。 當您編寫b = x ,您僅將b鏈接到x,並且在循環中修改b實際上僅更改了它所引用的列表, x引用的相同列表在每次迭代時都沒有重新定義(與a不同) )。

這是淺拷貝與深拷貝的經典案例。

下面的代碼將為您提供預期的結果。

import copy
x = [1,1,1]

while True:
    a = [1,1,1]
    b = copy.deepcopy(x)
    a.append(1)
    b.append(2)
    print(a)
    print(b)

默認情況下,賦值語句不復制對象,它們在目標和對象之間創建綁定。

默認情況下為淺拷貝。 要完全復制值,我們需要如上面的代碼所示的deepcopy

暫無
暫無

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

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