我有个问题。恐怕这对您可能很明显,但是我目前还不太了解。

我刚刚阅读了片分配以及空列表分配的工作原理,例如删除项目,例如:

>> L=['a','b','c','d']
>> L[2:3] = []
>> L
['a', 'b', 'd']


但是,这是我的问题-更加期望此输出是否更合乎逻辑?

['a', 'b', [], 'd']


我知道如果我的代码如下所示,上述输出将为true:

>> L=['a','b','c','d']
>> L[2:3] = [[]]
>> L


但是为什么以这种方式构造它而不像f.e .:

>> L=['a','b','c','d']
>> L[2:3] = None
>> L


它对我来说看起来过于复杂,因为我希望当我执行切片分配时,我不希望在这种情况下会改变列表的长度,或者我只是想删除切片并在此处启动一个空列表同时。

编辑:我不知道我是否足够清楚-我不明白为什么-做切片分配时-python解释器删除列表中的一个项目,而不是将此项目更改为空列表。

最佳答案

我认为混淆是由于您确实在切片而不是在建立索引。观察:

>>> L = ['a','b','c','d']
>>> L[2] = []
>>> L
['a', 'b', [], 'd']


请注意,对于2-3的范围,L[2:3]L[2]是“相同的”,只是2(因为切片是非包含性的)。但是,切片和索引是两种不同的行为,因为切片可以更改列表的长度,而索引只是修改现有元素。



空列表以这种方式工作的原因是由于切片分配的工作方式。当您分配给切片时,python解压缩您提供的切片并将其结果存储到索引中。观察:

>>> L = ['a', 'b', 'c', 'd']
>>> L[2:4] = 'e'
>>> L
['a', 'b', 'e']
>>> L = ['a', 'b', 'c', 'd']
>>> L[2:4] = 'efgh'
>>> L
['a', 'b', 'e', 'f', 'g', 'h']


由于Python中字符串的行为,L[2:4] = 'e'L[2:4] = ['e']的行为在python中是相同的:它们可能会被迭代并因此解压缩。

因此,当您放置L[2:4] = []时,它将解压缩[]的所有元素,并将其内容分配到索引2和3中。当然,由于没有元素,因此将它们分配为零(请注意:与或None-实际上什么都没有),因此将其删除。

关于python - 带有空列表的切片分配-为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52452462/

10-15 06:55