追加循环,python

时间:2014-09-24 14:56:40

标签: python list python-2.7 append

我有一个非常奇怪的问题,在列表中附加。

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']

我真的不明白为什么输出就像这样,而不是追加到最后,它只是创建一个具有相同值的列表。 但是如果我在循环中使用追加它就可以了。

2 个答案:

答案 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)]