何时使用完整列表切片?

时间:2017-03-14 18:42:15

标签: python list slice

所以我明白,如果我有一个像

这样的清单
>>> dinner = ['steak', 'baked potato', 'red wine']

然后具有未指定的起点和终点的切片是整个列表

>>> dinner[:]
['steak', 'baked potato', 'red wine']

我的问题是,这个完整的列表切片是否曾在实践中使用过,如果是这样,它的用例是什么?为什么不在没有切片表示法dinner的情况下引用列表[:]

2 个答案:

答案 0 :(得分:4)

完整列表切片是制作列表的浅表副本的常用Python语法。

>>> dinner = ['steak', 'baked potato', 'red wine']
>>> dinner1 = dinner  # just another reference to the original object
>>> dinner2 = dinner[:]  # makes a new object
>>> dinner[0] = 'spam'
>>> dinner1  # dinner1 reflects the change to dinner
['spam', 'baked potato', 'red wine']
>>> dinner2  # dinner2 doesn't reflect the change to dinner
['steak', 'baked potato', 'red wine']

如果您只引用没有切片的原始列表,您还会看到新参考中原始列表的更改。这有时是你想要的,有时不是你想要的。

答案 1 :(得分:3)

如果在赋值运算符的LHS上使用,则使用完整列表切片来改变列表就地

>>> dinner = ['steak', 'baked potato', 'red wine']
>>> dinner[:] = ['pasta']
>>> dinner
['pasta']

否则,当你需要修改/改变原始列表时,一个完整的列表切片通常很方便,比如在一个循环中,你需要保留一个参考副本,更恰当地称为浅拷贝:

for i in dinner[:]:
    # mutate dinner without running into problems

这允许for循环的行为与原始列表的状态一致。

您还可以使用copy.copy或在原始列表中调用list来创建浅层副本,但[:]更常用,是一种语言结构,也不那么详细。< / p>