列表切片并制作副本

时间:2018-04-23 04:52:41

标签: python list

阅读有关切片列表的内容;我被困在这里: -

a = [1, 3, 5]
b = a[:]
a[:] = [x**2 for x in a]
a[:] = [0]
print(b) # output --> [1,3,5]

这个: -

a = [1, 3, 5]
b = a
a[:] = [x**2 for x in a]
a[:] = [0]
print(b) # output --> [0]

我知道b = a[:]正在复制列表a但是b=a在第二个示例中做了什么?在打印输出时,在第一种情况下,b不会被修改,但会在第二种情况下被修改。这种行为的原因是什么? 我不是在询问如何进行切片,而是想知道为什么所提到的代码都表现得奇怪而且不同。

2 个答案:

答案 0 :(得分:3)

b = a是一个引用的赋值:它使变量b指向变量a所指向的相同列表。因此,当您使用a[:] = ...更新下一行中该列表的内容时,ab都指向更新后的列表。

如果下一行是a = [x**2 for x in a](而非a[:] = ...),则会创建新列表[1,9,25]并指定变量a指向它,离开b仍然指向原始列表。

答案 1 :(得分:1)

当您执行b = a时,只需创建对变量a的引用,此引用的名称为b。引用只是同一对象的另一个名称。您没有创建变量a的副本。因此,如果您修改b,它也会修改a,反之亦然。

但是,如果您执行b = a[:],则表示您正在创建变量a的浅表副本,并将其分配给名为b的新变量。由于b是副本,因此修改其中任何一个,都不会改变另一个。

这就是为什么在最后打印b时会得到两个不同的答案。