簡體   English   中英

在python中復制列表:深層次與淺層復制:在python中找到我的問題?

[英]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] = 1vectorized[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.

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