如何解释?
s = [1,2,3,4,5,6,7,8,9]
s[0] = s[0:0] #replace s[0] by empty list s[0:0]
s
[[], 2, 3, 4, 5, 6, 7, 8, 9] # s after assignment
len(s)
9
s[3] = s[0:0] # samething for s[3]
[[], 2, 3, [], 5, 6, 7, 8, 9] # s after s[3] has been replaced by s[0:0]
len(s)
9
s[5:7] = s[0:0] # replace a slice by empty list
s
[[], 2, 3, [], 5, 8, 9] # slice has been removed
len(s)
7
通过遵循第一部分中的逻辑,其中元素被空列表替换并且列表的长度是守恒的,我可以预期切片的每个元素应该被空列表替换。
嗯,事实并非如此!怎么解释?
答案 0 :(得分:2)
列表的长度始终是守恒的,这是不正确的。这是真的,左边的切片被替换为右边的切片。
lst = [0, 1, 2, 3, 4, 5, 6, 7]
print(lst[0]) # prints one value
print(lst[3]) # prints one value
print(len(lst[1:3])) # prints 2, length of sublist
print(len(lst[:])) # prints 4, length of whole list
lst[:] = [] # replace entire list with empty list
顺便说一下,使用切片[0:0]
获取零长度列表非常奇怪。如果代码只放了[]
(表示零长度列表的文字),则更容易理解。
答案 1 :(得分:2)
s[3] = s[0:0] # replacing single element
s[5:7] = s[0:0] # replacing two elements and setting to [] removes the elements.
using s[5] = s[0:0],s[6] = s[0:0] is different from s[5:7]
如果您将s[5:7] = s[0:0]
更改为s[5:7] = s[0:2]
,您将获得不同的行为,两者都会被更改。
如果使用s[5:7] = s[0:1]
,则索引5处的元素将被更改,索引6处的元素将被删除。
答案 2 :(得分:2)
如果左侧有列表中的单个元素,则用右侧的任何内容替换该单个元素。
如果左侧有切片,则将该切片的所有元素替换为右侧列表中的元素。如果您在右侧没有列表或其他类型的可迭代,则分配将失败。由于右侧的列表为空,因此您最终删除了元素。