2013-04-20 49 views
2

許多Python的列表方法在原地運行並返回None(關閉我的頭頂,insert,sort,reverse)。列表分配去了哪裏?

但是,有一種行爲經常使我感到挫折。如果我創建一個新的列表,通常會返回一個對象,並在同一時間將其插入,新名單「消失」:

mytup = (0, 1, 2, 3, 4) 
print mytup # (0, 1, 2, 3, 4) 
mylist = list(mytup) 
print mylist # [0, 1, 2, 3, 4] 
newlist = list(mytup).insert(0, 10) 
print newlist # None 

所以,如果我想修改一個元組,它需要更多的線路:

newlist = list(mytup) 
newlist.insert(0, 10) 
print newlist # [10, 0, 1, 2, 3, 4] 

所以我有兩個問題:

  1. 它是正確的說,當我調用列表的構造函數,它返回的對象,但是當我打電話列表構造函數的方法就可以了,該方法使用0123「覆蓋」返回?再次,名單
  2. 有沒有辦法插入一個元組並返回一行中的列表?我不是想打代碼高爾夫,我只是不認爲這兩條線在邏輯上是不同的,不值得分離。
+1

我認爲將它們放在一行上將是一個壞主意。他們是單獨的操作,爲什麼試圖將它們塞進一行? – 2013-04-20 14:45:26

+0

在我的腦海裏,我有一個序列,我想修改它。如果它是一個列表,我可以直接插入。但它恰好是我自己的錯誤的一個元組,所以我必須使用兩行代碼?它減緩了我的思維過程。我認爲這是列表和元組在許多情況下具有類似行爲的結果。 – Lenna 2013-04-20 14:58:35

+0

它不會「覆蓋」返回值。發生什麼事是,當你做'list(...)。insert(...)'你實際上在調用新創建列表的方法,你不再要求構造函數的結果。當然,這個方法返回'None'。 – ubik 2013-04-20 15:00:15

回答

1

您的第一個問題的答案已經給出;您將最後一次函數調用的結果分配給該變量,即None。這是你的第二個問題的答案。

而不是使用插入件,這樣做:

newlist = [10] + list(mytup) 

它創建包含元素的新list被插入,其附加到轉換tuple並存儲(參考到)將所得list

這當然只適用於要插入任何一端的情況。

如果您需要將新元素插入其他位置,則必須切片tuple,例如,在tuple中的第三個元素後面插入:

newlist = list(mytup[:3]) + [10] + list(mytup[3:]) 
3

insertsortreverse修改就地列表,並返回None。在你的代碼中,你實際上將返回值存儲在newlist變量中。

newlist = list(mytup).insert(0, 10)

,以及在新創建的列表(動態創建)是垃圾收集有對它的引用了。

In [151]: mytup = (0, 1, 2, 3, 4) 

In [152]: lis=list(mytup) #create a new list object and add a reference to this new object 

In [153]: newlist=lis.insert(0,10) #perform the insert operation on lis and store None 
            # in newlist 

In [154]: print newlist  
None 

In [155]: print lis  
[10, 0, 1, 2, 3, 4] #you can still access this list object with 
        #the help of `lis` variable. 
+0

我知道他們返回無(編輯澄清);但在我的第三項任務中,名單消失了,而且從未被命名。我認爲我在Q1中所描述的理解是正確的。 – Lenna 2013-04-20 14:56:12

+0

@Lenna在newlist = list(mytup).insert(0,10)的情況下,python首先創建列表list(mytup),然後執行insert操作,然後在'newlist '。但是現在沒有一個變量指向新創建的列表,因此python的垃圾收集器將其從內存中移除。 – 2013-04-20 15:00:58