2013-06-28 50 views
1

我試圖創建一個函數,它返回給定數字中的所有循環數字,它給了我一個奇怪的結果。該功能是:Python列表追加返回奇數結果

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」的迴歸正是我要找的,但名單「隊伍現狀」似乎並不具備正確的「 y'值附加到它。我想知道這是Python引用列表的問題,但我無法弄清楚。謝謝。

+0

什麼是循環數? –

+0

另外,一句話是的。您將多個'y'列表追加到'circ''多次。 –

回答

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[:]只是創建臨時爲y的一個完整的切片,其天然產生的副本。

+0

謝謝。我認爲我已經整理了所有的參考問題,顯然並非如此。我很感激幫助。 – TomR

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