2014-10-05 86 views
1

作爲編程的初學者,我試圖用Python來做到這一點。我想要一個簡單的函數,它將一個列表作爲參數,並返回另一個列表,它僅僅是原始列表旋轉一次(因此rotate([1, 2, 3])將返回[2, 3, 1]),同時保持原始列表不變。Python:操作列表

我知道,這一個

def rotate(list): 
    list.append(list[0]) 
    list.remove(list[0]) 

將改變地方列表(和返回無)。

但是這一次

def rotate_2(list): 
    temp = list 
    temp.append(temp[0]) 
    temp.remove(temp[0]) 
    return temp 

也會改變,以代替原始表(在返回所需的列表)。

,第三個

def rotate_3(list): 
    temp = [x for x in list] 
    temp.append(temp[0]) 
    temp.remove(temp[0]) 
    return temp 

得到所需的結果,一方面保持原來不變的是返回一個新的列表。我不能理解rotate_2的行爲。爲什麼當list函數只是在temp上執行某些操作時會被更改?它給了我一種感覺,就好像listtemptemp = list「連接」了。爲什麼rotate_3沒問題?對不起,如果我的英文很奇怪,那不是我的第一語言(不像Python)。

+1

因爲'temp = list **不**創建副本,不像'rotate_3'中的列表理解。 – jonrsharpe 2014-10-05 20:52:26

回答

2

rotate_2templist指的是相同的列表,所以當你改變一個,他們都改變。

rotate_3中,您正在複印。使複印件稍微更習慣的方法是:

temp = list[:] 

如下我個人會寫這樣的功能:

def rotate_4(l): 
    return l[1:] + [l[0]] 

這使用slicinglist concatenation

請注意,我已將list更名爲l,因爲listbuilt-in name

+0

據我所知,'l = [1,2]'在某種Python的柏拉圖式宇宙中創建一個列表並給出一個名稱'l','temp = l'給出_that_ list的另一個名稱, l [:]'複製'l'並切片? – LChris314 2014-10-07 09:17:31

+0

@ LChris314:的確如此。 – NPE 2014-10-07 09:52:07