Python列表复制-混乱

Python列表复制-混乱,python,python-3.x,Python,Python 3.x,这里是Python初学者。阅读一篇关于列表参考的文章,浅拷贝和深拷贝,尝试了以下内容: a=['a','b','c'] b=列表(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=列表(xs)#制作一个浅拷贝 xs[1][0]=“X” >>>xs

这里是Python初学者。阅读一篇关于列表参考的文章,浅拷贝和深拷贝,尝试了以下内容:

a=['a','b','c']
b=列表(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=列表(xs)#制作一个浅拷贝
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


文章链接:

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

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


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

你可以通过查看对象上的“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

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


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

这是因为
list()
功能会生成一个新列表,如果您在分配后更改原始列表,则新列表不会更改

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

var='a'
列表1=[var'a',b']
list2=list1
打印(列表1)
打印(列表2)
输出:

['a', 'a', 'b']
['a', 'a', 'b']
['a', 'a', 'b']
['a', 'a', 'b']
您可以更改
var
的值,两个列表都将更改,除非您:

var='a'
列表1=[var'a',b']
var='c'
list2=list1
打印(列表1)
打印(列表2)
输出:

['a', 'a', 'b']
['a', 'a', 'b']
['a', 'a', 'b']
['a', 'a', 'b']
为什么?
因为当你做
list1=[var,'a','b']
var
的值是
'a'
,但是当你改变它的值时,这不会影响
list1
,因为它保存了
var
本身的值,所以
list2
都不是什么文章?无法区分不可变对象列表上的深度副本和浅层副本。list()函数将任何iterable作为参数,因此它会创建一个新的列表对象。Try list(open('text_file','r').read())我知道它创建了一个新的列表对象,但它创建了一个浅副本,这意味着它只有一层深。List对象是新的,但List的元素仍然是对原始列表的子元素的引用。我会用实际工作的代码更新我的问题。这里答案的副本会回答你的问题question@KevinGlasson完美,正是我想要的。谢谢谢谢当它只是一个参考,很明显,它会给出结果,但我正在尝试浅拷贝,并试图了解我看到你的更新的行为。。。这让我心烦意乱