Python中list[:0]切片赋值字符串为何拆分为单字符列表?
切片赋值的运行逻辑说明
你对[:0]是空切片的判断是完全正确的,之所以赋值后得到拆分成单个字符的列表,核心是Python列表的切片赋值规则和字符串本身的可迭代特性,和切片是不是空没有关系:
所有列表切片赋值操作,等号右边必须传入可迭代对象,执行时不会把整个对象作为单个元素存入列表,而是会先遍历这个可迭代对象,把里面的每一个元素按顺序取出,再替换掉切片覆盖的原有列表片段。
- 字符串本身就是可迭代对象,直接遍历字符串时,每次得到的结果就是字符串里的单个字符。
- 对
list_a[:0]这个切片来说,它对应的范围是列表从索引0开始、到索引0结束的区间,也就是列表最开头、长度为0的位置,没有任何需要被替换掉的原有元素。
对应代码的实际执行步骤
你写的三行代码运行流程如下:
string_a = "abcdef" list_a = [] list_a[:0] = string_a
- 第一步:创建内容为
abcdef的字符串,绑定到变量string_a - 第二步:创建空列表,绑定到变量
list_a - 第三步:执行切片赋值:
- 先计算切片范围:起始索引0,结束索引0,确定要删除的原有元素数量为0,插入位置为列表最头部
- 遍历等号右侧的
string_a,依次取出单个字符:"a"、"b"、"c"、"d"、"e"、"f" - 先删除切片范围内的0个元素,再把遍历得到的6个字符按顺序插入到头部位置,最终得到
["a","b","c","d","e","f"]
补充验证
你可以用两个简单测试验证这个逻辑:
- 如果想要把整个字符串作为单个元素插入列表头部,只需要把等号右边改成包裹字符串的列表即可:
list_a[:0] = [string_a],运行结果为["abcdef"]——这时候等号右边的可迭代对象是列表,遍历后只得到一个元素,也就是完整的字符串。 - 如果对非空列表做非空切片赋值,逻辑完全一致:比如
test_list = [1,2,3],执行test_list[1:2] = "xy"后,结果为[1, 'x', 'y', 3]:原切片覆盖的元素是索引1位置的2,先删掉2,再把遍历字符串得到的x、y插入到对应位置。
内容的提问来源于stack exchange,提问作者younes alaoui
相关产品推荐
相关产品推荐

