我有个问题。恐怕这对您可能很明显,但是我目前还不太了解。
我刚刚阅读了片分配以及空列表分配的工作原理,例如删除项目,例如:
>> 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/