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

liftword5个月前 (12-17)技术文章79

在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数据类型字符串的几种表示形式

Python数据类型字符串的几种表示形式字符串用于表示文本数据。字符串中的字符可以是 ASCII字 符、各种符号以及各种 Unicode 字符。字符串属于不可变序列,不能直接修改字符串,不能在原处修改...

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

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

Python 的 51 个秘密曝光,Github 获 20000 star

ython, 是一个设计优美的解释型高级语言, 它提供了很多能让程序员感到舒适的功能特性. 但有的时候, Python 的一些输出结果对于初学者来说似乎并不是那么一目了然.一个解析51项堪称是"...

如何最简单、通俗地理解Python模块?

说简单点,Python模块就是带.py后缀的可执行文件,用来重复调用变量和函数。比方说,你在数据分析过程中反复需要读取CSV文件,除了使用pandas等现成的库方法外,还可以自己写一个模块用于调用。#...