[英]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可以附加到每個迭代中並保持其修改? 謝謝。
由於b
和x
是對同一列表對象的引用,因此您的代碼等效於
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.