我有一个非常奇怪的问题,在列表中附加。
import random
def CreatePopulation(a, r):
pippo=range(a)
print pippo
i=0
prova=[]
while i<r:
random.shuffle(pippo)
print pippo
prova.append(pippo)
print prova
i=i+1
return prova
pop=CreatePopulation(5,10)
print pop
example=["a","b"]
example.append("c")
print example
我无法上传整个输出,因为该网站说格式不正确。 但是输出它是一个十倍相同值的列表,x的最后一个shuffle,像这样:
[[1, 0, 4, 2, 3], [1, 0, 4, 2, 3], [1, 0, 4, 2, 3], [1, 0, 4, 2, 3], [1, 0, 4, 2, 3],
[1, 0, 4, 2, 3], [1, 0, 4, 2, 3], [1, 0, 4, 2, 3], [1, 0, 4, 2, 3], [1, 0, 4, 2, 3],
[1, 0, 4, 2, 3]]
但是在循环中附加的示例正常工作:
['a', 'b', 'c']
我真的不明白为什么输出就像这样,而不是追加到最后,它只是创建一个具有相同值的列表。 但是如果我在循环中使用追加它就可以了。
答案 0 :(得分:1)
我遇到了同样的问题,并且正在努力理解为什么问题发生。 &#39;追加&#39;的描述我在互联网上看到的功能是它&#34;将新项目(对象)附加到数组的末尾&#34;。根据这种描述,上述问题甚至不可能发生。
在我看来,&#39;追加&#39;而不是将对象添加到列表的末尾,向该对象添加引用。因此,当您尝试在循环中使用时,它会一次又一次地在内存中添加对相同位置的引用(尽管该位置中的值更改)。所以最终得到2D数组,其中每一行都指向内存中的相同位置。
您可以在循环结束后通过更改 pippo 数组的值来检查:
def CreatePopulation(a, r):
pippo=range(a)
print pippo
i=0
prova=[]
while i<r:
random.shuffle(pippo)
print pippo
prova.append(pippo)
print 'prova=', prova
i=i+1
random.shuffle(pippo) #here we change pippo after appending of prova is done
return prova
pop=CreatePopulation(5,10)
print 'pop=', pop
在结果中会有类似的内容:
prova= [[0, 2, 3, 4, 1], [0, 2, 3, 4, 1], [0, 2, 3, 4, 1], [0, 2, 3, 4, 1], [0, 2, 3, 4, 1], [0, 2, 3, 4, 1], [0, 2, 3, 4, 1], [0, 2, 3, 4, 1], [0, 2, 3, 4, 1], [0, 2, 3, 4, 1]]
pop= [[2, 0, 1, 3, 4], [2, 0, 1, 3, 4], [2, 0, 1, 3, 4], [2, 0, 1, 3, 4], [2, 0, 1, 3, 4], [2, 0, 1, 3, 4], [2, 0, 1, 3, 4], [2, 0, 1, 3, 4], [2, 0, 1, 3, 4], [2, 0, 1, 3, 4]]
pop 显示的值与循环中的最后一个 prova 不同,因为我们已经更改 pippo prova < / em>指的是。
我现在可以看到为什么在循环中创建一个新的 pippo 列表可以解决问题。
我还没有发现这个&#39;追加&#39;参考逻辑要在任何地方明确解释,这就是为什么要留下这个评论。
答案 1 :(得分:0)
代码多次附加相同的列表(pippo
)。
换句话说,在循环结束时,prova
将包含类似:
prova = [pippo, pippo, pippo, pippo, ..., pippo]
在循环中创建一个新列表将解决问题。
def CreatePopulation(a, r):
prova = []
for i in range(r):
pippo = range(a)
random.shuffle(pippo)
prova.append(pippo)
return prova
BTW,使用返回新列表的sample.shuffle
,您不需要每次都创建一个源列表:
def CreatePopulation(a, r):
pippo = range(a)
return [random.sample(pippo, a) for i in range(r)]