10

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

def ModList(element):
    element = 'TWO'

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

但是这种方法不会修改列表。这就像元素是按值传递的。输出是:

['one','two','three']
['one','two','three']

我希望函数调用后列表的第二个元素为“TWO”:

['one','TWO','three']

这可能吗?

4

4 回答 4

6

已经在这里的解释是正确的。但是,由于我想以类似的方式滥用 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 数组使用“原始”内存分配并允许返回数据视图。视图允许以不同的方式表示数据,同时保持与原始数据的关联。因此,一个工作示例是

>>> 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])
>>> 

虽然提取单个元素仍然仅按值复制,但维护 element 的数组视图2会引用 的原始元素2a尽管它现在是 的元素0c,并且对c' 的值所做的更改也会更改a

Numpyndarray有许多不同的类型,包括通用对象类型。这意味着您可以为几乎任何类型的数据维护这种“按引用”行为,而不仅仅是数值。

于 2016-09-08T18:26:46.227 回答
5

Python 是一种按值传递的语言,因此您不能通过函数中的赋值来更改值ModList。您可以做的是将列表和索引传递到ModList然后以这种方式修改元素

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

ModList(l, 1)
于 2013-04-02T21:21:26.437 回答
4

Python不会通过引用传递。只需明确地这样做:

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

此外,由于这只更改了一个元素,我建议这ModList是一个令人困惑的名称。

于 2013-04-02T21:20:56.323 回答
0

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

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

l = ModList(l, 1)
于 2020-07-14T14:03:17.087 回答