【问题标题】:Using python list comprehension to modify the list itself, unexpected result?使用 python 列表推导修改列表本身,意外结果?
【发布时间】:2019-11-14 18:10:50
【问题描述】:

我尝试对列表A 中的每个元素进行更改,并有两种方法:use_list_comprehension(A, length)use_plain_loop(A, length)。两者对元素执行相同的操作,但产生不同的结果。

我的问题是:python 列表理解是否首先复制A,然后使用该副本作为源来获取元素并对其执行操作?

def arrange(A):
    length = len(A)
    A = use_list_comprehension(A, length) # we get [19, 20, 12, 1, 8]

    # A = use_plain_loop(A, length) # we get [19, 95, 12, 476, 2383]
    return A        


def use_list_comprehension(A, length):
    return [ A[i]+A[A[i]]*length for i in range(length) ]


def use_plain_loop(A, length):
    for i in range(length):
        A[i] += A[A[i]]*length
    return A


print(arrange([4,0,2,1,3]))

【问题讨论】:

  • 答案不同,因为列表实际上是针对use_plain_loop 修改的,因此在计算下一个值时,它使用更新后的值。

标签: python list loops list-comprehension


【解决方案1】:

不,列表推导不是复制 A,而是创建一个新列表,其中存储在该列表的索引 i 中的值是 A[i]+A[A[i]]*length。因此,use_list_comprehension(A, length) 返回一个新列表,然后在第 3 行将 A 设置为该新列表。另一方面,use_plain_loop(A, length) 实际上修改了列表,因为A[i] += A[A[i]]*length 替换了存储在A[i] 中的值A[i] + A[A[i]]*length

【讨论】:

  • 非常感谢 Jacob 的及时答复。一个后续问题是 use_list_comprehension(A, length) 创建一个新列表后是否占用 O(n) 空间?
  • 是的,use_list_comprehension(A,length) 会占用 O(n) 空间。
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2020-07-02
相关资源
最近更新 更多