2017-07-18 75 views
0

我正在手動執行幾個像append(),insert()等列表方法。我試圖在列表的末尾添加元素(如append方法) 。這是我使用的工作代碼:如何在python中用函數(帶返回值)更新列表

arr = [4,5,6] 

def push(x, item): 
    x += [item] 
    return x 

push(arr,7) 
print(arr)  #Output: [4,5,6,7] 

但是,當我實現相同的代碼沒有什麼區別。我得到不同的輸出。

arr = [4,5,6] 

def push(x, item): 
    x = x + [item] 
    return x 

push(arr,7) 
print(arr)  #Output: [4,5,6] 

而且我對插入方法也是一樣的。下面是插入方法的代碼:

arr = [4,5,7,8] 

def insert(x, index, item): 
    x = x[:index] + [item] + x[index:] 
    return x 

insert(arr,2,6) 
print(arr)  #Output: [4,5,7,8] 

我知道我可以通過arr=insert(arr,2,6)返回值保存到列表中,但我想要一個替代的解決方案,該列表中調用函數像我的第一個代碼樣本中後自動獲得更新。

編輯1: 我認爲x[index:index] = [item]是更好的解決方案的問題。

+0

[相關](https://stackoverflow.com/questions/15376509/when-is-ix-different-from-iix-in-python) – jacoblaw

回答

1

您可以分配到一個列表的片段來實現你insert瓦特/ O使用list.insert

def insert(x, index, item): 
    x[:] = x[:index] + [item] + x[index:] 

這種替換由x用新的列表中引用的對象的內容。由於它是在原地執行的,因此無需再返回它。

+1

爲什麼不使用'x [index:index] = [item ]'?這避免了至少一些臨時副本:) – MSeifert

1

x += [item]x = x + [item]沒有什麼不同。在第一種情況下,您要求更改x引用的列表;這就是爲什麼結果反映了這種變化。第二,你要求x引用一個新列表,這個列表通過結合x的原始值和[item]而得出。請注意,這是而不是更改x,這就是爲什麼你的結果不變。

另請注意,您的返回語句無關緊要,因爲返回的值將被忽略。

-2

問題是你沒有捕獲到你返回的結果。一些操作(如+=)修改原始列表;其他人(例如x = x + item)評估新列表並重新分配本地變量x

特別注意的是,x不是綁定arr; x只是一個局部變量。爲了獲取返回的值轉換成arr,你必須給它分配:

arr = push(arr, 7) 

arr = insert(arr, 2, 6) 
0

在你突變(又名改變)的列表對象通過x提到你的第一個例子。當Python看到x += [item]它,它翻譯成:

x.__iadd__([item]) 

正如你所看到的,我們通過突變調用它通過x所指名單對象的超載就地操作功能__iadd__。前面已經說過,__iadd__()變異現有列表對象:

>>> lst = [1, 2] 
>>> lst.__iadd__([3]) 
[1, 2, 3] 
>>> lst 
[1, 2, 3] 
>>> 

在你的第二個例子,你叫Python的分配x到一個新的參考。現在引用的是通過組合(而不是變異)x[item]列表製成的新列表對象的引用者。因此,x從未改變。

當Python看到x = x + [item]可以翻譯成:

x = x.__add__([item]) 

名單__add__功能不變異現有列表對象。相反,它返回通過梳理通過現有列表的值和參數做了一個新的列表到__add__()

>>> lst = [1, 2] 
>>> lst.__add__([3]) # lst is not changed. A new list is returned. 
[1, 2, 3] 
>>> 

您需要的push版本的結果返回給arr列表。 insert也是如此。