深度剖析python中None乘以数字会异常的原因
在Python中,将整数与None相乘会引发Type Error(类型错误)- 让我们分析为什么?
如果执行5 * None会引发TypeError(类型错误)。
但是,下面的所有操作都可以正常执行:
# A.
`5 * True`
# B
5 * "Spam"
# SpamSpamSpamSpamSpam
# C
5 * [1, 2]
# [1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
# D
5 * None
# TypeError(类型错误)
让我们看看为什么会这样:
简而言之,在Python中,乘法操作的行为取决于操作数的数据类型。
?None?是Python中表示缺省值或空值的特殊常量。
Python不知道如何将整数(或任何其他数据类型)乘以None?。
因此,尝试执行5 * None?会引发TypeError?(类型错误)。
让我们逐个选项进行解释:
A) 5 * True?:
Python将True?视为整数值1?。
将整数与另一个整数相乘会得到整数乘法的结果。
因此,5 * True?的结果是5?。
B) 5 * "Spam"?:
这里,一个操作数是整数,另一个是字符串。
在Python中,将字符串与整数相乘会将字符串复制相应次数。
因此,5 * "Spam"?的结果是"SpamSpamSpamSpamSpam"?。
C) 5 * [1, 2]?:
该操作涉及一个整数和一个列表。
将列表与整数相乘会将列表复制相应次数。
因此,5 * [1, 2]?的结果是[1, 2, 1, 2, 1, 2, 1, 2, 1, 2]?。
额外说明 - 内部解释和分析为什么5 * None?会引发类型错误
Python解释器在执行不同数据类型之间的操作时遵循一组特定的规则和逻辑。Python中的每种数据类型都有一组关联的方法和行为,决定了它与其他类型的交互方式。
当Python遇到表达式5 * None?时,它会尝试通过调用乘法操作来计算结果。在Python中,乘法操作通过特殊方法实现:__mul__?用于常规乘法,__rmul__?用于反向乘法。
对于整数,__mul__?方法被定义为处理与其他数字的乘法。但是,当它遇到它不认识或没有设计处理的数据类型(例如None?)时,它将尝试推迟到该类型的__rmul__?方法。
现在,None在Python中的类型是NoneType?。NoneType?没有定义__mul__?或__rmul__?方法,因为将“None”(或空值)与任何其他值相乘在语义上是不明确的。
当解释器意识到参与乘法的对象都无法处理该操作时,它会引发TypeError?(类型错误)。错误消息有效地传达了该操作在这两种类型之间不受支持。
这种机制确保了Python中的类型安全。通过引发TypeError?(类型错误),Python确保不会错误地执行没有明确或有意义结果的操作,从而避免产生意外或无意义的结果。
不允许整数和None?之间的操作的设计选择在语义和实际观点上都是有道理的。从语义上讲,乘以None是模棱两可的。从实际角度来看,阻止这种操作可以减少代码中的错误可能性,因为如果有人试图对None?进行算术运算,很可能是一个错误。