切片[::-1]最直接高效,但只浅层反转且对列表不原地修改;reversed()返回迭代器省内存但需转list才能索引;字符串反转首选s[::-1],避免list().reverse()等低效操作。

用切片 [::-1] 反转最直接,但要注意可变对象的副作用
Python 中最常用、最 Pythonic 的反转方式就是切片 [::-1]。它对字符串、元组、列表都有效,返回一个**新对象**——这点很关键。
对字符串和元组(不可变类型),[::-1] 安全无副作用;但对列表(可变类型),如果你误以为它会原地修改,就可能踩坑:
-
my_list = [1, 2, 3]; my_list[::-1]返回[3, 2, 1],但my_list本身仍是[1, 2, 3] - 想原地反转?得用
my_list.reverse()或my_list[:] = my_list[::-1] -
reversed()函数返回迭代器,不是列表,需显式转成list(reversed(my_list))才能用索引
用 reversed() 处理大序列更省内存
当你要遍历一个超长列表或字符串的反向元素,又不打算一次性全加载进内存时,reversed() 是更轻量的选择。
它不生成新列表,只返回一个反向迭代器,适合流式处理或配合 for 循环使用:
for char in reversed("hello"):
print(char) # 输出: o l l e h
注意:reversed() 要求对象实现 __reversed__() 方法,内置序列(如 list、str、tuple)都支持,但自定义类需手动实现。
- 对字符串:必须先转为
list再reversed(),否则报错TypeError: 'str' object is not reversible - 想拼回字符串?用
''.join(reversed(s)),比s[::-1]略慢但内存友好
反转嵌套结构时,切片不递归,别指望自动“深反转”
[::-1] 和 reversed() 都只做**浅层反转**:它们调换顶层元素顺序,但每个子元素内部不变。
例如:
data = [[1, 2], [3, 4], [5, 6]] print(data[::-1]) # [[5, 6], [3, 4], [1, 2]] —— 子列表没被翻转
如果需要每个子列表也反转,得手动组合:
- 仅反转外层:用
data[::-1] - 外层 + 每个内层都反转:用
[sub[::-1] for sub in data[::-1]]或list(map(lambda x: x[::-1], reversed(data))) - 深度嵌套?考虑用递归函数,切片无法替代
字符串反转别用 list().reverse(),效率低还多此一举
有人把字符串转成 list,再调 .reverse(),最后 ''.join() 拼回去——这完全没必要,且性能差。
原因很实在:
-
str是不可变对象,任何“反转”都得新建字符串,绕路操作徒增开销 -
s[::-1]由 C 层优化,速度最快;''.join(reversed(s))次之;list(s)[::-1]最慢(多一次 list 构造 + join) - 实测 10 万字符字符串:切片耗时约 0.008ms,
join(reversed())约 0.012ms,三步法约 0.025ms
除非你在反转过程中要对每个字符做复杂判断或过滤,否则别拆解字符串。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











