Python:更改列表中的元素

时间:2013-12-16 11:08:56

标签: python for-loop element variable-assignment

我一直在观察这种奇怪的行为。现在我想知道原因。

请参阅下面的示例。

有人可以解释为什么 - 以及是否有其他选项更类似于第一个版本执行第二个版本的操作。

>>> a
>>> [1, 0, 1, 1]

>>> for el in a:
        el = 1

>>> a
>>> [1, 0, 1, 1]

>>> for i in range(len(a)):
        a[i] = 1

>>> a
>>> [1, 1, 1, 1]

4 个答案:

答案 0 :(得分:3)

您的第一个片段:

for el in a:

仅获取a中项目的值,它们不会引用列表中的项。因此,当您尝试重新分配时,您只需更改el的值,而不是列表中的项目。

虽然这个:

a[i]

检索a本身的项目,而不仅仅是值。

要更改a的所有值,您可以创建新副本并将其重新分配回a

a = [1 for _ in a]

这是最有效的方法。如果您想同时使用值和索引来重新分配它,请使用enumerate

for index, el in enumerate(a):
    print el #print the current value
    a[index] = 1 #change it,
    print el #and print the new one!

希望这有帮助!

答案 1 :(得分:1)

我通常最终会使用这样的东西:

a = [1 for el in a]

列表理解是我更新列表中避免索引的项目的首选方法。

答案 2 :(得分:0)

Pythons变量是对象的名称,而不是内存中位置的名称。因此

el = 1

不会更改对象el指向1。相反,它使el现在指向对象1。它根本不会修改列表中的任何内容。为此,您必须直接修改列表:

a[2] = 1

答案 3 :(得分:0)

快速枚举给出了元素的不可变副本,因此速度优于索引迭代方法。

for el in a:# el is immutable

其中

for i in range(len(a)):
        a[i] = 1

修改其内存位置的值,因为listname[<index>]实际为baseaddress+index*offset。索引以零开始的原因之一