1

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

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 引用列表的方式有关,但我无法弄清楚。谢谢。

4

2 回答 2

1

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

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 的完整切片,它本身会产生一个副本。

于 2013-06-28T19:37:03.747 回答
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)]

输出

[[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]
于 2013-06-28T19:41:37.083 回答