Python列表分配

时间:2014-05-20 00:16:27

标签: python python-2.7 ipython

如何解释?

 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

通过遵循第一部分中的逻辑,其中元素被空列表替换并且列表的长度是守恒的,我可以预期切片的每个元素应该被空列表替换。

嗯,事实并非如此!怎么解释?

3 个答案:

答案 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)

如果左侧有列表中的单个元素,则用右侧的任何内容替换该单个元素。

如果左侧有切片,则将该切片的所有元素替换为右侧列表中的元素。如果您在右侧没有列表或其他类型的可迭代,则分配将失败。由于右侧的列表为空,因此您最终删除了元素。