在python中复制列表:深层次与浅层复制:在python中找到我的问题?

时间:2012-03-30 00:09:44

标签: 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]

我做错了什么。以及我如何实现我想要实现的目标。 基本上我正在尝试创建单位向量。 感谢

5 个答案:

答案 0 :(得分:9)

这一行(这些行,真的):

vector = vectorized

复制列表参考。您需要对序列内容进行浅层复制。

vector = vectorized[:]

答案 1 :(得分:5)

您正在创建单个列表,然后为其提供多个不同的名称。请记住,a = b不会创建新对象。它只是意味着a和b都是同一个东西的名称。

请改为尝试:

for ...:
    vector = [0] * length
    ...

答案 2 :(得分:4)

该行

vector = vectorized

没有制作vectorized的副本。每当你从那时起改变vector时,你也会改变`vectorized。

您可以将第一行更改为:

vector = vectorized[:]

import copy
vector = copy.copy(vectorized)

如果你想复制一份。

答案 3 :(得分:2)

在Python中,当您将列表分配给新列表时,新列表只是一个指针而不是一个全新的列表。

因此,当您尝试修改“vector”的值时,实际上是在更改“vectorized”的值。 在你的情况下, vector[i] = 1 和...一样  vectorized[i] = 1

答案 4 :(得分: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,你们快点!