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

2024-04-19 05:24:56 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么下面两个例子会有不同的结果?我认为对列表进行切片将导致列表元素的(浅层)副本,因此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]

Tags: thein元素列表example副本情况切片
3条回答

Slicing的行为不同,这取决于它是在表达式中使用(例如,在赋值的右侧)还是在赋值的目标/左侧。如果切片也在左侧创建了一个浅拷贝,则不可能直接更改列表的切片,赋值的结果也将丢失。你知道吗

列表片段根据上下文的不同而不同:

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

这是一个片分配,意思是将值[0, 0]分配给a中的一个节。这显然改变了a。你知道吗

b = a[3: 5]

这将创建a部分的副本,并将其分配给b。它与a无关。修改b根本不会影响a。你知道吗

切片切片分配混淆。切片创建新列表,切片分配修改现有列表。你知道吗

修改列表本身:

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)

相关问题 更多 >