2013-04-02 54 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有许多不同的类型,包括一个通用的对象类型。这意味着您可以为几乎任何类型的数据维护此“引用”行为,而不仅仅是数值。