[英]Copying list in python: deep vs shallow copy: gotcha for me in python?
所以這就是我試圖做的。
vectorized = [0] * length
for i,key in enumerate(foo_dict.keys()):
vector = vectorized
vector[i] = 1
print vector
vector = vectorized
print vectorized
所以我希望的是例如長度為4.所以我創建了一個4維向量:
vectorized=[0,0,0,0]
現在,根據字典的索引(在這種情況下長度為4)創建一個值為1的向量,而rest為零
so vector = [1, 0,0,0] , [0,1,0,0] and so on..
現在發生的事情是:
vector = [1,0,0,0],[1,1,0,0] .. and finally [1,1,1,1]
甚至矢量化現在
[1,1,1,1]
我做錯了什么。 以及我如何實現我想要實現的目標。 基本上我正在嘗試創建單位向量。 謝謝
這一行(這些行,真的):
vector = vectorized
復制列表引用。 您需要對序列內容進行淺層復制。
vector = vectorized[:]
您正在創建單個列表,然后為其提供多個不同的名稱。 請記住,a = b不會創建新對象。 它只是意味着a和b都是同一個東西的名字。
試試這個:
for ...:
vector = [0] * length
...
這條線
vector = vectorized
沒有復制vectorized
。 每當你從那時起改變vector
時,你也會改變`向量化。
您可以將第一行更改為:
vector = vectorized[:]
要么
import copy
vector = copy.copy(vectorized)
如果你想復制一份。
在Python中,當您將列表分配給新列表時,新列表只是一個指針而不是一個全新的列表。
因此,當您嘗試修改“向量”的值時,實際上是在更改“向量化”的值。 在您的情況下, vector[i] = 1
與vectorized[i] = 1
您的問題是,當您編寫vector = vectorized
它不會創建數組的副本,而是在兩者之間創建綁定。
Python中的賦值語句不復制對象,它們在目標和對象之間創建綁定。
http://docs.python.org/library/copy.html
這應該可以幫助你解決它。
這里有一個來自python REPL的小片段來向你展示我的意思。
>>> vectorized = [0] * 4
>>> print vectorized
[0, 0, 0, 0]
>>> vector = vectorized
>>> vector[1] = 1
>>> print vectorized
[0, 1, 0, 0]
編輯:Jeez,你們快!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.