【问题标题】:Python: Changing Elements in ListPython:更改列表中的元素
【发布时间】:2014-01-03 18:07:55
【问题描述】:

我观察这种奇怪的行为已经有一段时间了。现在我想知道原因。

请参见下面的示例。

有人可以解释为什么 - 以及是否有其他选项与第一个版本更相似,可以执行第二个版本。

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

【问题讨论】:

    标签: python for-loop element variable-assignment


    【解决方案1】:

    你的第一个sn-p:

    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!
    

    希望这会有所帮助!

    【讨论】:

    • 嗯,这是一个快速的反应!谢谢,不知道。
    • 嗯,el 对项目本身的引用。但不,这不是对列表中位置的引用,我猜这就是你的意思。
    【解决方案2】:

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

    a = [1 for el in a]
    

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

    【讨论】:

      【解决方案3】:

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

      el = 1
      

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

      a[2] = 1
      

      【讨论】:

        【解决方案4】:

        快速枚举提供了元素的不可变副本,因此相对于索引迭代方法具有速度优势。

        for el in a:# el is immutable
        

        在哪里

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-18
          • 1970-01-01
          • 2015-04-07
          • 2016-07-21
          • 2015-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多