[英]Creating Python variables that are independent of each other
如果我有這個Python代碼:
foo = [3, 5, 9]
bar = foo
bar.append(9)
print(foo)
它回來了
[3, 5, 9, 9]
這肯定意味着當我將9
添加到bar
,它也會影響foo
。 如何使變量bar
等於foo
,但是當我編輯bar
,它不會影響foo
?
您正在更改可變值,因此您需要制作一個顯式副本:
bar = list(foo)
要么
bar = foo[:]
在Python中分配名稱時,您所做的只是存儲對值的引用 。 在不創建列表副本的情況下, foo
和bar
引用了相同的列表。
對於非可變值,這不是問題; 您可以將對字符串的引用替換為指向不同的值。
但是列表(以及dict
和set
以及大多數類的實例)都是可變的。 你沒有改變foo
,你改變了foo
指的值 。 你做了foo.append(9)
,Python認為:
foo
所指的值。 .append
。 這將返回列表實例上的方法。 9
。 這改變了清單。 Python名稱本身只不過是標簽,指向實際值。 您可以將值視為氣球,將名稱視為小紙標簽,分配是將標簽綁定到氣球的行為。 bar = foo
創建了第二個紙質標簽,它與完全相同的氣球相關聯 。
看到我的這個較舊的答案 ,我將氣球比喻推到了更遠處。
在刪除對原始文件的所有引用(因此無法編輯原文)時創建原件的副本時,使用深層復制。
http://docs.python.org/2/library/copy.html
import copy
bar = copy.deepcopy(foo)
使用deepcopy
:
>>> from copy import deepcopy
>>> foo = [3, 5, 9]
>>> bar = deepcopy(foo)
>>> bar.append(9)
>>> print(foo)
[3, 5, 9]
>>> print bar
[3, 5, 9, 9]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.