代码之家  ›  专栏  ›  技术社区  ›  Batman

Python列表副本-混乱[重复]

  •  2
  • Batman  · 技术社区  · 6 年前

    蟒蛇初学者。阅读一篇关于列表参考文献的文章,浅浅的和深的副本,尝试了以下几点:

    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/

    5 回复  |  直到 6 年前
        1
  •  2
  •   Axel Anaya    6 年前

    那是因为 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”]
    

    为什么? 因为当你这么做的时候 list1=[var, 'a', 'b'] 有价值的 'a' ,但更改其值时,这不会影响 list1 变量 本身,所以 list2

        2
  •  1
  •   clubby789 uppi    6 年前

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

        3
  •  1
  •   brentertainer    6 年前

    当你说 b = list(a) ,您正在创建一个新列表 b 其值与中的值相同 a

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

        4
  •  1
  •   Ben Rauzi    6 年前

    b = a -这将使“b”引用与“a”相同的列表(对象)。

    b = list(a) 你创造了一个 独立于“a”的列表。

        5
  •  1
  •   David Buck Richard Ferris    6 年前

    你可以通过查看对象上的“id”来检查发生了什么。你看得出来 b = a 在命名空间中创建一个新条目,该条目仅引用与 a ,但是 c = a[:] d = list(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