传递列表元素作为参考

时间:2013-04-02 21:19:09

标签: python python-2.7

我将列表的单个元素传递给函数。我想修改该元素,因此,列表本身

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': [ '一个', 'TWO', '3']

这是可能的吗?

提前谢谢

4 个答案:

答案 0 :(得分:4)

Python doesn't do pass by reference。只是明确地做:

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

另外,由于这只会改变一个元素,我建议ModList是一个令人困惑的名字。

答案 1 :(得分:4)

Python是一种按值传递的语言,因此您无法通过函数ModList中的赋值更改值。你可以做的是将列表和索引传递给ModList然后修改那个元素

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

ModList(l, 1)

答案 2 :(得分:4)

这里的解释是正确的。但是,由于我想以类似的方式滥用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的数组视图会引用2的原始元素a(尽管它现在是元素{{ 1 {} 0},以及对c值的更改c也是如此。

Numpy a有许多不同的类型,包括通用对象类型。这意味着你可以保持这个" by-reference"几乎任何类型的数据的行为,而不仅仅是数值。

答案 3 :(得分:0)

在许多情况下,您还可以考虑让函数同时修改并返回修改后的列表。这使调用者代码更具可读性:

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

l = ModList(l, 1)