深度剖析python中None乘以数字会异常的原因

liftword4个月前 (12-17)技术文章65

在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?进行算术运算,很可能是一个错误。

专栏:持续分享改善python代码质量的实用技巧

相关文章

Python中如何使用断言-assert,它起到什么样的作用

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理本文章来自腾讯云 作者:somenzz私信小编回复01可领取学习资料以及学习视频今天...

8.python学习笔记-类 python中类有什么用

类的定义面向对象编程提供了一种有效的软件管理方式,通过编写描述现实世界中的事物和情景的类,可以定义同类对象的通用行为,继承父类的子类可以定制个性化的行为。根据类创建对象的过程称为实例化,指定可在实例中...

Python教程:第11篇 变量赋值 python中变量赋值语句例子

在前几篇中,我们已经学习了如何在Python中表示字符串、数值、逻辑值等字面值数据。也学习了如何使用变量引用这些数据。本文开始学习如何操作这些数据。操作数据最常用的方式是使用运算符。运算符即对数据进行...