在 python 3 中,int(50)<'2'会导致TypeError,并且确实应该如此。然而,在 python 2.x 中,int(50)<'2'会返回True(其他数字格式也是如此,但int在 py2 和 py3 中都存在)。那么,我的问题有几个部分:
int(50)<'2'
TypeError
True
int
为什么 Python 2.x (< 3?) 允许这种行为?
intan小于 a 是什么意思str?
它指的是ord/吗chr?
ord
chr
是否存在一些不太明显的二进制格式?
'5'在这方面和有区别吗u'5'?
'5'
u'5'
您观察到的这种行为是,Python 2.x 允许整数和字符串之间的比较(如int(50) < '2'),但 Python 3.x 会引发TypeError,这源于 Python 2 和 Python 3 处理类型比较和隐式转换的方式的一些根本差异。让我们分解一下您的问题:
int(50) < '2'
在 Python 2.x 中,语言设计包含一些 Python 3.x 中不允许的隐式类型强制转换。具体来说,Python 2 在某些情况下允许在异质类型(如整数和字符串)之间进行比较,并且会隐式转换它们以进行比较。这是 Python 2 中流行的“鸭子类型”理念的一部分。
当您执行与 Python 2 类似的比较时int(50) < '2',该语言不会立即抛出错误。相反,它会'2'隐式地将字符串转换为整数,然后进行比较。发生这种情况是因为 Python 2 的比较行为更加宽松,试图“理解”不同类型的比较。
'2'
在 Python 2 中,这种行为通常出现在混合类型比较中,例如比较整数和浮点数,或比较整数和字符串,其中 Python 2 可能会在执行比较之前强制其中一个操作数(在本例中,将字符串转换为整数)。
虽然这种行为在 Python 2 中在某些情况下可能很方便,但允许类型之间进行隐式强制转换会导致错误和混乱。例如,将字符串'2'隐式视为数字可能会导致无意的逻辑错误,尤其是在更复杂或模棱两可的情况下。
允许这种行为的决定很可能受到当时 Python 的设计理念的影响,这种理念强调灵活性和易用性(有时以牺牲严格的类型安全性为代价)。然而,随着 Python 的发展,很明显,根本不同的类型(如整数和字符串)之间的隐式类型转换是微妙错误的来源,因此 Python 3 被设计为强制执行更严格的类型安全性并防止此类比较。
str
在 Python 2.x 中,比较整数和字符串(例如int(50) < '2')涉及隐式转换,但比较的具体含义是什么?
如果将比较视为数字和字符串的比较,则这种比较int(50) < '2'没有太多直观意义,但 Python 2 尝试使其起作用。以下是发生的情况:
2
50
50 < 2
False
一般来说,当 Python 2 比较整数和字符串时,会将字符串转换为整数(如果可能),然后进行比较。
此行为与ord()或chr()无关,后者用于在字符和其 ASCII 值之间进行转换。比较有效是因为 Python 2 尝试将字符串解释为数字。
ord()
chr()
是的,有区别,但它更微妙,并且取决于 Python 2 如何处理 Unicode 字符串。
unicode
但是,如果两者属于同一类型,例如两者都是字节字符串或两者都是 Unicode 字符串,则比较的方式与比较任何其他两个字符串的方式类似。在这种情况下:
'5' < '2'
u'5' < u'2'
如果 Python 2 允许隐式地比较intandstr或intand unicode,您可能会根据字符串的内部编码或它们在内存中的表示方式遇到不同的结果,但 Python 2 不会直接在整数和 Unicode 字符串之间执行隐式转换。因此,在与其他类型交互时,'5'和 的u'5'处理方式不同。
在 Python 3 中,类型安全性得到了改进,并且删除了字符串与其他类型之间的隐式转换,从而使语言更加可预测。现在,将整数 ( int) 与字符串 ( str) 进行比较会引发TypeError,因为 Python 3 在这种情况下不会尝试强制类型。如果您想在 Python 3 中进行比较50,'2'则需要将字符串显式转换'2'为整数 ( int('2')) 或反之亦然。
int('2')
在 Python 3 中,int和之间的比较str不再被允许,并且会引发TypeError。