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

为何Union[List[List[int]],List[int]]会被mypy判定为List[Union[...]]?

类型提示兼容问题:mypy报Union类型赋值不兼容

问题代码

from typing import Union, List, Any
v: Union[list[list[int]], list[int]] = [-1,3,1,6,-5] # Create a list of ints
if not isinstance(v[0], list):
    v = [v]
v = [v] # Cast list of ints to list of list of ints
print(v)

mypy报错信息

functions.py:5: error: Incompatible types in assignment
(expression has type "List[Union[List[List[int]], List[int]]]",
variable has type "Union[List[List[int]], List[int]]") [assignment]
Found 1 error in 1 file (checked 1 source file)

报错原因

你给v声明的类型是Union[list[list[int]], list[int]],限定它只能是一维整数列表或二维整数列表。但执行v = [v]时,新的v会变成包裹原类型的列表:

  • 若原v是一维list[int],新v为list[list[int]]
  • 若原v是二维list[list[int]],新v为list[list[list[int]]]

mypy会严格匹配声明类型,它推断[v]的类型是List[Union[list[list[int]], list[int]]],和你声明的Union类型不兼容,因此报错。

另外你提到“实际最终对象是list[list[int]]”,但实际代码执行后v是三维列表——因为你先把一维列表包裹成二维,接着又做了一次包裹操作。

解决方案(无法修改代码逻辑时)

方案1:扩展类型声明范围

修改v的类型声明,覆盖最终实际类型:

v: Union[list[list[int]], list[int], list[list[list[int]]]] = [-1,3,1,6,-5]

方案2:使用类型断言

通过cast明确告诉mypy最终类型:

from typing import Union, List, cast

v: Union[list[list[int]], list[int]] = [-1,3,1,6,-5]
if not isinstance(v[0], list):
    v = [v]
v = cast(list[list[list[int]]], [v])
print(v)

或者直接用注释跳过类型检查:

v = [v]  # type: ignore[assignment]

内容的提问来源于stack exchange,提问作者Indiano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:27:40