You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:14:57