簡體   English   中英

創建彼此獨立的Python變量

[英]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中分配名稱時,您所做的只是存儲對值的引用 在不創建列表副本的情況下, foobar引用了相同的列表。

對於非可變值,這不是問題; 您可以將對字符串的引用替換為指向不同的值。

但是列表(以及dictset以及大多數類的實例)都是可變的。 你沒有改變foo ,你改變了foo 你做了foo.append(9) ,Python認為:

  • 找到foo所指的值。
  • 在該值上找到屬性.append 這將返回列表實例上的方法。
  • 調用方法,傳入值9 這改變了清單。

Python名稱本身只不過是標簽,指向實際值。 您可以將值視為氣球,將名稱視為小紙標簽,分配是將標簽綁定到氣球的行為。 bar = foo創建了第二個紙質標簽,它與完全相同的氣球相關聯

看到我的這個較舊的答案 ,我將氣球比喻推到了更遠處。

你復制一份:

bar = foo[:]  #copy of foo
bar.append(9)

這與python如何處理賦值有關。 賦值說“將對象放在右邊,並將其存儲在本地命名空間左側的名稱下” 所以,在你的情況下,你有foo和bar引用相同的對象,這就是為什么追加到另一個也會影響另一個對象的原因。

當使用通常在對象上運行的運算符(例如+= )時,對於不可變對象,事情會變得更有趣。 在這里查看我的答案以及更多解釋。

在刪除對原始文件的所有引用(因此無法編輯原文)時創建原件的副本時,使用深層復制。

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.

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