Python列表切片赋值实测:插入、替换和步长限制
【摘要】 七组Python实测说明普通切片赋值为何可以插入、缩短和删除元素,以及扩展切片的长度约束、原地更新与浅复制的区别。
问题从一行赋值开始
做 Python 列表练习时,容易把 a[1:3] = values 理解为“替换两个位置”。实际结果还取决于右侧元素个数。下面七组示例已在 Python 3.10.4 中运行验证,代码只使用内置功能。
1. 普通切片可以改变长度
a = [0, 1, 2]
a[1:1] = ['A', 'B']
print(a) # [0, 'A', 'B', 1, 2]
a = [0, 1, 2, 3]
a[1:3] = ['A']
print(a) # [0, 'A', 3]
a = [0, 1, 2, 3]
a[1:3] = []
print(a) # [0, 3]
第一组选择的是空区间,所以变成了插入;第二组用一个元素替换两个元素,长度减少一;第三组相当于删除选定区间。右边界不包含在选中范围内,原索引3对应的元素会保留。
这适合批量修订列表片段,但如果后续代码保存了旧索引,长度变化后就需要重新检查位置。循环中反复修改同一个列表的长度,也容易跳过元素;可以先收集修改结果,再统一更新。
2. 带步长的扩展切片有长度约束
a = [0, 1, 2, 3]
a[::2] = [8, 9]
print(a) # [8, 1, 9, 3]
a = [0, 1, 2, 3]
try:
a[::2] = [8]
except ValueError:
print(a) # [0, 1, 2, 3]
a[::2] 选中两个位置。这里步长为2,赋值元素个数必须匹配;只提供一个元素会抛出 ValueError。本组失败后原列表仍保持不变。不能把普通连续切片允许变长的规则直接套到扩展切片上。
3. 原地修改与创建副本要分清
a = [0, 1, 2]
alias = a
a[:] = [9]
print(a, alias, a is alias)
# [9] [9] True
a = [0, 1, 2]
copy = a[:]
copy[0] = 8
print(a, copy, a is copy)
# [0, 1, 2] [8, 1, 2] False
给 a[:] 赋值会修改原列表,因此 alias 也看得到变化;读取 a[:] 则创建另一个列表。这里的副本是浅复制:示例只包含整数;如果列表里还有嵌套列表,内部对象仍可能共享,不能据此推断任意嵌套数据都互不影响。
实际使用时的检查点
修改前先确定选中的位置数、步长以及右侧元素个数,再决定是否允许长度变化。如果其他地方持有同一列表引用,原地更新会同步影响它们;如果希望保留原列表,就先创建合适的副本。遇到切片赋值结果不符合预期时,打印修改前后列表和长度,通常比只看一行表达式更容易定位原因。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)