Python 为什么可以';t列表是否包含多个类型?

Python 为什么可以';t列表是否包含多个类型?,python,python-3.x,type-hinting,typehints,Python,Python 3.x,Type Hinting,Typehints,可以在元组或列表中混合类型。为什么不能在键入提示中指定 >>> from typing import Tuple, List >>> t = ('a', 1) >>> l = ['a', 1] >>> t2: Tuple[str, int] = ('a', 1) >>> l2: List[str, int] = ['a', 1] TypeError: Too many parameters for ty

可以在元组或列表中混合类型。为什么不能在键入提示中指定

>>> from typing import Tuple, List
>>> t = ('a', 1)
>>> l = ['a', 1]

>>> t2: Tuple[str, int] = ('a', 1)
>>> l2: List[str, int] = ['a', 1]

TypeError: Too many parameters for typing.List; actual 2, expected 1
您可以使用
联合
,但通常,如果可以避免,列表应该是同质的,而不是异构的:

from typing import List, Union
lst: List[Union[str, int]] = [1, 'a']
myp
至少可以接受这一点


这意味着您的列表访问器将返回联合类型,通常需要在任何下游函数中处理不同的可能类型。接受工会的问题通常较少

在类型理论中,列表是包含一种类型值的同质结构。因此,
List
只接受一种类型,并且该列表中的每个元素都必须具有该类型

然而,类型理论也提供了总和类型,您可以将其视为从某个固定类型集中选择的一个值的包装器。
type.Union
支持总和类型。要指定列表是
int
str
值的混合,请使用

List[Union[str, int]]
如类型提示所示


相反,元组是产品类型的一个示例,该类型由一组固定的类型组成,其值是一组值,产品类型中的每种类型各有一个值
Tuple[int,int,int]
Tuple[str,int]
Tuple[int,str]
都是不同的类型,根据产品中的类型数量和它们出现的顺序进行区分。

因为通常不会在列表和其他序列中混合使用类似的类型。如果您想要一个可以是字符串或整数的列表,您可以这样做,但不能按位置。这是一个特例。你可以:
列出[Union[str,int]]
。而我恰好发布了一篇我自己的文章,说明了我与Union之间的问题。。。