【问题标题】:How does list() in python works for below scenario? [duplicate]python中的list()如何用于以下场景? [复制]
【发布时间】:2021-11-15 17:38:46
【问题描述】:
A = [12, 34, [56]]
B = list(A)
A[2][0] = 89
A[1] = 70
print(B)

输出:

B is [12,34,[89]]

而不是 [12,70,[89]]

我是 python 新手,我不明白为什么 B 是 [12, 34, [89]] 而不是 [12, 70, [89]]? B 的内存与 A 不同,为什么只有 B 的索引 3 会随着 A 的变化而更新?

【问题讨论】:

  • 它们都引用了您创建的同一个列表,[56]
  • 谢谢@MateenUlhaq。

标签: python list function memory memory-management


【解决方案1】:

因为B = A and B = list(A) 不同。 list() 复制 A 的值。它与 Javascript B = [...A] 中的深度复制相同

【讨论】:

    【解决方案2】:

    在Python中,赋值有浅拷贝和深拷贝三种 list(A)相当于B=A,B不创建新的内存空间,只是对A的引用 所以修改A会影响B 可以通过id检查A和B的内存地址是否相同

    另外一个是浅拷贝,通过B=A[:],B新建了一块内存,使用id,我们可以发现它并没有指向同一块内存 此时修改B并不会影响A,但是因为是浅拷贝,所以只拷贝了一层,而当修改A中嵌套的[56]时,B也会发生变化

    使用深拷贝B=copy.deepcopy(A) 可以完全避免

    【讨论】:

      【解决方案3】:

      这是因为你写了B=list(A) 看例子:

      A = [12, 34, [56]]
      B = list(A)
      print(id(B))
      # 140206999437504
      
      print(id(A))
      # 140206999413120
      
      A[2][0] = 89
      A[1] = 70
      print(B)
      # [12,34,[89]]
      

      他们有不同的地址,但如果你使用B = A,你会得到你想要的。

      A = [12, 34, [56]]
      B = A
      print(id(B))
      # 140206999354368
      
      print(id(A))
      # 140206999354368
      A[2][0] = 89
      A[1] = 70
      print(B)
      # [12, 70, [89]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-25
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多