为何mypy禁止将list[str]赋值给list[str | int]?
为什么
list[str]无法赋值给list[str | int]? 先看你给出的代码和错误提示:
if __name__ == '__main__': list1: list[str] = [] list2: list[str | int] = [] list2 = list1
错误提示:
error: Incompatible types in assignment (expression has type "List[str]", variable has type "List[Union[str, int]]")
核心原因是Python的list是可变容器,不支持协变。
你可能会觉得str是str | int的子集,对应的列表类型也应该兼容,但可变容器的类型兼容性逻辑不一样:如果允许把list[str]赋值给list[str | int],后续你可以通过list2往里面添加整数,而list1实际还是原来的list[str],这就会导致list1里混入了非字符串类型,破坏了它的类型一致性——比如之后你遍历list1调用字符串的方法(比如.strip()),就会因为里面的整数抛出运行时错误。
Mypy作为静态类型检查器,就是要提前阻止这种可能引发类型安全问题的操作,所以才会报错。
如果要解决这个问题,有几个可行的方案:
- 使用只读序列类型:把
list2的类型改成Sequence[str | int],Sequence是只读接口,支持协变,因为只读容器不会有被修改导致类型污染的问题 - 创建新列表:通过
list2 = list(list1)生成一个新的list[str | int],这样两个列表是独立的,后续修改list2不会影响list1 - 强制类型转换(不推荐):用
typing.cast绕过检查,比如list2 = cast(list[str | int], list1),但这么做会失去静态类型检查的保护,只有你能确保绝对不会修改list2时才考虑用
内容的提问来源于stack exchange,提问作者Some_Person
相关产品推荐
相关产品推荐

