isinstance(obj, list)是最直接可靠的方式,因iter()或for循环无法区分list、tuple、str等可迭代对象,而type(obj)==list会拒绝list子类;需用list特有方法、序列化校验或防字符串误用时必须严格判断。

用 isinstance(obj, list) 是最直接可靠的方式。
为什么不能只靠 iter() 或 for 循环判断?
因为 list、tuple、str、set、dict、生成器、自定义类(只要实现了 __iter__)都是可迭代对象。仅测试“能否遍历”无法区分它们。
为什么不用 type(obj) == list?
它会拒绝继承自 list 的子类实例,而这类对象行为上仍是真正的 list。例如:
class MyList(list): pass
ml = MyList([1, 2])
type(ml) == list # False
isinstance(ml, list) # True
哪些情况需要严格判断是否为 list?
- 要使用
.append()、.extend()、.insert()等特有方法前做类型防护 - 序列化或 API 输入校验时,明确要求必须是 list(而非 tuple 或 deque)
- 避免把字符串误当列表处理(
"abc"可迭代,但通常不是你想要的“列表”)
补充:如果还需兼容常见序列类型(如 tuple、str),可用 collections.abc.Sequence
但注意:str 和 bytes 也是 Sequence,而 set、dict 不是。若目标是“有序、支持索引、可重复”的容器,这个抽象基类比单纯检查 list 更灵活。
from collections.abc import Sequence
isinstance(obj, Sequence) and not isinstance(obj, (str, bytes))
—— 这能覆盖 list/tuple/range/bytearray 等,排除字符串干扰。