首页 > 解决方案 > Python列表副本 - 困惑

问题描述

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/

标签: pythonpython-3.x

解决方案


那是因为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两者都没有


推荐阅读