阅读有关切片列表的内容;我被困在这里: -
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
不会被修改,但会在第二种情况下被修改。这种行为的原因是什么?
我不是在询问如何进行切片,而是想知道为什么所提到的代码都表现得奇怪而且不同。
答案 0 :(得分:3)
b = a
是一个引用的赋值:它使变量b
指向变量a
所指向的相同列表。因此,当您使用a[:] = ...
更新下一行中该列表的内容时,a
和b
都指向更新后的列表。
如果下一行是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
时会得到两个不同的答案。