我正在尝试创建一个函数,它返回给定数字中的所有循环数,并且它给我一个奇怪的结果。功能是:
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引用列表的问题,但我无法弄明白。感谢。
答案 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]]