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
.append()、.extend()、.insert() 等特有方法前做类型防护"abc" 可迭代,但通常不是你想要的“列表”)collections.abc.Sequence
但注意:str 和 bytes 也是 Sequence,而 set、dict 不是。若目标是“有序、支持索引、可重复”的容器,这个抽象基类比单纯检查 list 更灵活。
from collections.abc import Sequence—— 这能
isinstance(obj, Sequence) and not isinstance(obj, (str, bytes))
