2013-04-02 150 views
1

我將列表的單個元素傳遞給函數。我想修改元素,因此,列表本身傳遞列表元素作爲參考

def ModList(element): 
    element = 'TWO' 

l = list(); 
l.append('one') 
l.append('two') 
l.append('three') 
print l 
ModList(l[1]) 
print l 

但這種方法不修改列表。這就像元素一直傳遞的價值。輸出是:

[ '一個', '2', '3']

[ '一個', '2', '3']

我想要的第二元件函數調用後的列表爲'TWO': ['one','TWO','three']

這是可行嗎?

預先感謝您

+0

沒有語法來完成你所要求的,但是有很多方法可以修改列表的一部分。如果你問一個關於你正在使用的具體問題的問題,有人會想出最直觀,最優雅的解決方案。 – alexis

回答

3

的Python doesn't do pass by reference。只要做到這一點明確:

l[1] = ModList(l[1]) 

而且,由於這只是改變一個因素,我建議ModList是一個令人困惑的名字。

3

Python是按值語言傳遞的,因此您不能通過函數ModList中的賦值來更改該值。你可以做的,而不是雖然是表和索引進入ModList然後修改元素的方式

def ModList(theList, theIndex) : 
    theList[theIndex] = 'TWO' 

ModList(l, 1) 
0

的說明已經在這裏是正確的。但是,因爲我想以類似的方式濫用python,所以我將提交此方法作爲解決方法。

從列表中調用特定元素直接返回列表中該元素的值的副本。即使複製列表的子列表也會返回對包含值的副本的數組的新引用。考慮下面這個例子:

>>> a = [1, 2, 3, 4] 
>>> b = a[2] 
>>> b 
3 
>>> c = a[2:3] 
>>> c 
[3] 
>>> b=5 
>>> c[0]=6 
>>> a 
[1, 2, 3, 4] 

無論b,值只複製,也不c,從a複製子列表,能夠改變a值。儘管它們有共同的起源,但沒有聯繫。

但是,numpy數組使用「raw-er」內存分配並允許返回數據視圖。視圖允許以不同方式表示數據,同時保持與原始數據的關聯。因此,一個工作示例是

>>> import numpy as np 
>>> a = np.array([1, 2, 3, 4]) 
>>> a 
array([1, 2, 3, 4]) 
>>> b = a[2] 
>>> b 
3 
>>> b=5 
>>> a 
array([1, 2, 3, 4]) 
>>> c = a[2:3] 
>>> c 
array([3]) 
>>> c[0]=6 
>>> a 
array([1, 2, 6, 4]) 
>>> 

雖然提取單個元件仍然值只,保持元件2的陣列視圖被引用到原始元素的a2副本(雖然現在元件的c0),並且對c的值進行的更改也會更改爲a

Numpy ndarray s有許多不同的類型,包括一個通用的對象類型。這意味着您可以爲幾乎任何類型的數據維護此「引用」行爲,而不僅僅是數值。