如何在循环迭代中重新初始化列表?

时间:2013-04-30 21:06:15

标签: python

我正在尝试创建无需替换的绘制,并将每个绘制的结果输出为文本文件。该列表位于一个单独的文件中,我想为循环的每次迭代重新导入它

import random
import numberlist

counter=0
draws= 100
while (counter<draws):
    x=  numberlist.listX     #this imports a list of strings eg. ['a341','c32k','42b]]

    random.shuffle(x)     

    x.pop()
    """OPERATIONS WITH POPPED VALUE"""

    counter += 1

我希望的是在每次循环迭代开始时X将被完全实现到完整的listX。相反,我发现每次弹出一个数字时,每个循环迭代的列表都会变小。为什么会发生这种情况,我怎么能绕过它呢?

谢谢。

2 个答案:

答案 0 :(得分:4)

您必须使用列表的浅表副本:

x=  numberlist.listX[:]  #or list(numberlist.listX)

仅使用x= numberlist.listX只会创建对同一对象的新引用。

示例:

In [1]: lis=[1,2,3]

In [2]: x=lis

In [3]: x is lis  #both point to the same object
Out[3]: True

In [4]: x=lis[:]  #create a shallow copy

In [5]: x is lis 
Out[5]: False

我认为你可以用这个替换你的while循环:

for item in (random.choice(lis) for _ in xrange(draws)):
    #do something with item

答案 1 :(得分:0)

如图所示here当在列表中调用pop时,它会删除列表中给定位置的项目,并将其返回。

考虑使用

创建对同一对象的新引用
x= numberlist.listX 

如上所述,预计列表在每次循环迭代中都不会有相同的元素。

我的建议是做一些事情:

import random

counter=0
draws= 100
xlist = ['a341','c32k','42b']
while (counter<draws):
    x = xlist

    random.shuffle(x)     

    print x[-1]
    """OPERATIONS WITH POPPED VALUE"""

    counter += 1

,其中

x[-1]

just returns the last element of the list