【问题标题】:Iterating in Python lists - does it copy or use iterator?在 Python 列表中迭代 - 它是复制还是使用迭代器?
【发布时间】:2012-04-20 17:55:41
【问题描述】:

我有一个这样的列表

a = [ [ 1,2,3 ], [ 4,5,6] ]

如果我写

for x in a:
    do something with x

a 中的第一个列表是否已复制到 x?或者 python 是否使用迭代器而不做任何额外的复制来做到这一点?

【问题讨论】:

    标签: python list iteration name-binding


    【解决方案1】:

    Python 不会将项目从 a 复制到 x。它只是将 a 的第一个元素称为 x。也就是说:修改x的同时,也修改了a的元素。

    这是一个例子:

    >>> a = [ [ 1,2,3 ], [ 4,5,6] ]
    >>> for x in a:
    ...     x.append(5)
    ... 
    >>> a
    [[1, 2, 3, 5], [4, 5, 6, 5]]
    

    【讨论】:

    • 要明确回应“Python 是否使用迭代器做到这一点”,答案是肯定的,但 Python 迭代器与 C++ 迭代器不太一样,而且 x 不是副本是分开的——如果你要做x = a[1],它也不会复制。
    【解决方案2】:

    首先,这些是可变列表[1, 2, 3],而不是不可变元组(1, 2, 3)

    其次,答案是它们不是复制而是通过引用传递的。因此,对于可变列表的情况,如果您在示例中更改 x 的值,a 也将被修改。

    【讨论】:

    • 它不是完全通过引用传递,尽管这与 Python 所做的很接近。并且要小心说“更改 x 的值”,因为 x = 3 不会修改 a
    • 感谢您的澄清。
    【解决方案3】:

    for element in aList: 执行以下操作:它创建一个名为element 的标签,该标签引用列表的第一项,然后是第二项……直到它到达最后一项。它不会复制列表中的项目。

    x.append(5) 将修改项目。写入x = [4, 5, 6] 只会将x 标签重新绑定到新对象,因此不会影响a

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 2016-11-19
      • 2015-01-01
      • 2014-04-27
      • 1970-01-01
      • 2015-05-20
      • 2018-01-28
      • 2010-12-23
      • 2014-04-27
      相关资源
      最近更新 更多