【问题标题】:Python list copy - Confused [duplicate]Python列表副本 - 困惑[重复]
【发布时间】:2019-08-03 23:05:22
【问题描述】:

这里是 Python 初学者。阅读有关列表引用、浅拷贝和深拷贝的文章,尝试了以下内容:

a = ['a', 'b', 'c']
b = list(a)
a[0] = 'A'

预期输出:

>>>a
['A', 'b', 'c']
>>>b
['A', 'b', 'c']

实际输出:

>>>a
['A', 'b', 'c']
>>>b
['a', 'b', 'c']

但是,它在以下情况下工作:

xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> ys = list(xs)  # Make a shallow copy

xs[1][0] = 'X'

>>> xs
[[1, 2, 3], ['X', 5, 6], [7, 8, 9]]
>>> ys
[[1, 2, 3], ['X', 5, 6], [7, 8, 9]]

如果我在这里遗漏了什么,有人可以解释一下吗? 谢谢

Python 3.7.4

文章链接:https://realpython.com/copying-python-objects/

【问题讨论】:

  • 什么文章?您无法区分不可变对象列表上的深拷贝和浅拷贝。
  • list() 函数将任何可迭代对象作为参数,因此它创建了一个新的列表对象。试试 list(open('text_file', 'r').read())
  • 我知道它创建了一个新的列表对象,但它创建了一个浅拷贝,这意味着它只有一层深。 List 对象是新的,但 list 的元素仍然是对原始列表的子元素的引用。我将使用实际工作的代码更新我的问题
  • 重复stackoverflow.com/a/28684234/9510611这里的答案回答了你的问题
  • @KevinGlasson 完美,正是我想要的。谢谢!

标签: python python-3.x


【解决方案1】:

这是因为list() 函数创建了一个新列表,如果您在分配后对原始列表进行更改,新列表将不会更改。

您可以使用变量值来做到这一点,但要小心,例如

var = 'a'
list1 = [var, 'a', 'b']
list2 = list1

print(list1)
print(list2)

输出:

['a', 'a', 'b']
['a', 'a', 'b']

您可以更改var 的值,两个列表都会更改,除非您这样做:

var = 'a'
list1 = [var, 'a', 'b']
var = 'c'
list2 = list1

print(list1)
print(list2)

输出:

['a', 'a', 'b']
['a', 'a', 'b']

为什么? 因为当你做list1=[var, 'a', 'b']var的值是'a',但是当你改变它的值时,这不会影响list1,因为它自己保存了var的值,所以list2既不

【讨论】:

  • 该死,我看到了你的更新......它让我大吃一惊 lmao
【解决方案2】:

list() 创建一个新列表,这意味着对原始列表的更改不会影响新列表。

【讨论】:

    【解决方案3】:

    当您说b = list(a) 时,您正在创建一个新列表b,其值与a 中的值相同。此时,每个列表的元素都是相等的,但它们不是同一个对象。也就是说,其中一个对象的变化不会反映在另一个对象中。他们是独立的。

    如果你说b = a,你是说ba 是引用同一个对象的名称。

    【讨论】:

      【解决方案4】:

      您所期待的是b = a - 这将使“b”引用相同的列表(对象)作为“a”。

      当您执行b = list(a) 时,您将创建一个独立于“a”的列表。

      【讨论】:

      • 谢谢!当它只是一个参考时,很明显它会给出结果,但是我正在尝试浅拷贝并试图理解行为
      【解决方案5】:

      您可以通过查看对象上的“id”来检查自己发生了什么。您可以看到b = a 在命名空间中创建了一个新条目,它仅引用与a 相同的对象,但c = a[:]d = list(a) 都创建了复制a 内容的新对象。

      a = ['a', 'b', 'c']
      id(a)
      Out[60]: 4690845768
      
      b = a
      id(b)
      Out[62]: 4690845768
      
      c = a[:]
      id(c)
      Out[65]: 4690851848
      
      d = list(a)
      id(d)
      Out[67]: 4690846728
      

      您刚刚在问题中添加了以下场景:

      xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
      ys = list(xs)
      

      确实xs和ys是不同的对象:

      id(ys)
      Out[70]: 4691198664
      id(xs)
      Out[71]: 4690895496
      

      但是嵌套列表本身就是对象。 ys = list(xs) 创建了一个新对象,但复制了内容 - 三个嵌套的列表对象。

      id(ys[0])
      Out[72]: 4690898696
      id(xs[0])
      Out[73]: 4690898696
      

      【讨论】:

        猜你喜欢
        • 2012-09-09
        • 1970-01-01
        • 2017-07-03
        • 2016-02-21
        • 2020-05-03
        • 2016-12-27
        • 2013-10-18
        • 2018-05-29
        • 2014-07-22
        相关资源
        最近更新 更多