为什么将列表切片分配给另一个变量会改变结果?

时间:2019-09-07 21:13:33

标签: python python-3.x

以下两个示例为什么会有不同的结果?我认为切片列表会导致列表元素的(浅)副本,因此a在两种情况下均不应更改。

>>> a = [1, 2, 3, 4, 5]
>>> a[3: 5] = [0, 0]  # example 1
>>> a
[1, 2, 3, 0, 0]       # elements in the original list are changed
>>> b = a[3: 5]       # example 2
>>> b = [100, 100]
>>> a                 # elements in the original list are unchanged
[1, 2, 3, 0, 0]

3 个答案:

答案 0 :(得分:6)

列表切片因上下文而异:

a[3: 5] = [0, 0]

这是切片分配,这意味着将值[0, 0]分配给a中的某个部分。显然可以修改a

b = a[3: 5]

这将创建a部分的副本,并将其分配给b。它与a无关。修改b完全不会影响a

答案 1 :(得分:3)

您将切片切片分配混淆了。 切片创建新列表,切片分配修改现有列表。

修改列表本身:

a = [1, 2, 3, 4, 5]
a[3: 5] = [0, 0]  # example 1

为切片部分创建一个新列表:

b = a[3: 5]       # example 2

将b的内容更改为其他一些新列表

b = [100, 100]

使用id检查它们是否相同:

a = [1, 2, 3, 4, 5]
a[3: 5] = [0, 0]  

b = a[3: 5]  
b = [100, 100]

print(id(a),id(b)) # (140150319362488, 140150319364288)

答案 2 :(得分:2)

Slicing的行为会有所不同,具体取决于是在表达式中(例如,在作业的右侧)还是在作业的目标/左侧使用它。如果切片也在左侧创建了浅表副本,则不可能直接更改列表的切片,并且分配结果将完全丢失。