Python中切片语法[:]的作用是什么?为何列表切片赋值字符串后会拆分为单字符列表
列表全切片[:]的功能与赋值规则
全切片[:]的核心定义
对序列类对象(列表、字符串、元组等),[:]代表选中序列覆盖全部元素的区间,和普通变量直接赋值存在本质差异:
- 普通赋值写法
li = 新对象仅修改变量名li的指向关联,让它关联到内存中的新对象,原本li指向的旧列表不会被改动 - 切片赋值写法
li[:] = 赋值内容直接修改li指向的原列表对象:先移除切片选中区间内的所有原有元素,再按规则将赋值内容填入对应位置,全程不会改变li变量绑定的内存地址
可以通过简单代码验证两者差异:
li = ['random values', True] li2 = li # li2与li指向同一个列表内存对象 li[:] = 'some text' print(li2) # 输出与li完全一致的拆分字符列表,因为原列表对象已被原地修改如果改用普通赋值修改
li的指向,其他关联原列表的变量读取到的内容不会发生变化。
赋值字符串被拆分为单个字符的原理
Python 列表的切片赋值有固定执行逻辑:等号右侧的赋值内容必须是可迭代对象,填充时会自动遍历该可迭代对象的每一个元素,依次放入被切片覆盖的列表位置,不会把右侧对象当成一个整体塞入列表。
字符串本身属于可迭代序列,遍历字符串时获取的元素就是拆分后的单个字符,因此执行li[:] = 'some text'的完整流程为:
- 移除原列表内全部2个原有元素(
'random values'、True) - 遍历右侧的字符串
'some text',将每个字符作为独立元素填入清空后的列表 - 最终得到由字符组成的列表
['s', 'o', 'm', 'e', ' ', 't', 'e', 'x', 't']
常见操作修正
如果需要将整个字符串作为单个元素存入列表,不要直接给全切片赋值字符串本身:
- 若可接受改变
li的变量指向:直接写li = ['some text'] - 若需要原地修改原列表对象(保持内存地址不变):将字符串包裹为单元素可迭代对象再做切片赋值,即写
li[:] = ['some text']
内容的提问来源于stack exchange,提问作者windows-weeb
相关产品推荐
相关产品推荐

