以下两个示例为什么会有不同的结果?我认为切片列表会导致列表元素的(浅)副本,因此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]
答案 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的行为会有所不同,具体取决于是在表达式中(例如,在作业的右侧)还是在作业的目标/左侧使用它。如果切片也在左侧创建了浅表副本,则不可能直接更改列表的切片,并且分配结果将完全丢失。