在列表切片上应用列表方法和重新分配有什么区别?

What are the differences between applying list methods and reassignment on a list slice?

提问人:push.up.hoyv 提问时间:8/22/2023 最后编辑:Gino Mempinpush.up.hoyv 更新时间:8/22/2023 访问量:50

问:

当我学习列表方法时,我在列表切片上尝试了这些代码:a[:]

a = list('zyx')
a[:].pop()
print(a)

a = list('zyx')
a[:].append('o')
print(a)

a = list('zyx')
a[:].clear()
print(a)

a = list('zyx')
a[:] = []
print(a)

我得到的结果是:

['z', 'y', 'x']
['z', 'y', 'x']
['z', 'y', 'x']
[]

让我感到困惑的是列表方法和重新赋值都改变了列表切片,但为什么重赋会影响原始列表,而列表方法却没有?

我知道这可能是关于浅拷贝的,但我无法确切地说出原因。

python 列表 切片 浅拷贝

评论

0赞 jasonharper 8/22/2023
列表切片读取可为您提供列表(部分)的浅拷贝。分配给列表切片会修改原始列表,因为分配给您原本没有引用的浅副本将完全没有意义。

答:

2赞 Bharel 8/22/2023 #1

了解下面的方法可能是成功的关键:

表达式中使用的切片调用切片的开始和结束位置。a[:]list.__getitem__(slice(None, None))None, None

调用具有切片的列表将返回由该切片组成的新列表对象(浅拷贝)。这意味着将对已创建的临时新列表进行操作。__getitem__a[:].anything()

等于 () 左侧的切片调用 。换句话说,它修改了现有列表 - 这是您通常期望的。a[:] = valuelist.__setitem__(slice(None, None), value)

正如@jasonharper所指出的,在没有其他引用的情况下修改新的临时切片会令人困惑,而且不是很有用;这是不对称的另一个原因。

评论

1赞 push.up.hoyv 8/22/2023
谢谢,你的回答现在更清楚了。我需要更多时间来理解您提到的功能。感谢您的快速回复。