Python列表附加返回奇数结果

时间:2013-06-28 19:28:23

标签: python list append

我正在尝试创建一个函数,它返回给定数字中的所有循环数,并且它给我一个奇怪的结果。功能是:

def getcircs(mylist):
    circs=[]
    x=mylist
    y=list(x)
    dig=len(x)-1
    j=0

    circs.append(x)

    while j < dig:
        for i in range(0,dig):
            r=i+1
            g=x[r]
            y[i]=g
        y[dig]=x[0]        
        print y
        circs.append(y)
        x=list(y)
        j+=1

    print circs
    return circs

正如你所看到的,当你运行它时,列表'y'正在返回我正在寻找的内容,但是列表'circs'似乎没有附加正确的'y'值。我想知道这是否是Python引用列表的问题,但我无法弄明白。感谢。

2 个答案:

答案 0 :(得分:1)

这是因为列表是引用的,您可以重复使用y。当您将y追加到circs时,circs会获得对y的另一个引用。稍后修改y时,您会看到circs中附加y的每个地点的更改。尝试制作y的副本并使用它。

def getcircs(mylist):
    circs=[]
    x=mylist
    y=list(x)
    dig=len(x)-1
    j=0

    circs.append(x)

    while j < dig:
        temp = y[:]
        for i in range(0,dig):
            r=i+1
            g=x[r]
            temp[i]=g
        temp[dig]=x[0]        
        print temp
        circs.append(temp)
        x=list(temp)
        j+=1

    print circs
    return circs

temp = y[:]只是将temp创建为y的完整切片,它本身生成一个副本。

答案 1 :(得分:1)

如果您想以更简单的方式(我认为无论如何)这样做,您可能会在此处使用itertools.cycle。这种方法也可以清理,但你明白了:

import itertools
my_list = [1, 2, 3, 4]
cycler = itertools.cycle(my_list)
list_size = len(my_list)
for i in range(list_size):
        print [cycler.next() for j in range(list_size)] # call next on the cycler generator
        cycler.next() # skip the next number

<强>输出

[1, 2, 3, 4]
[2, 3, 4, 1]
[3, 4, 1, 2]
[4, 1, 2, 3]

事实上,这是一个单行:

print [[cycler.next() for j in range(list_size + 1)][:-1] for i in range(list_size)]

<强> OUTOUT

[[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]