小能豆

为什么在 python 2.x 中 int(50)<str(5)?

py

在 python 3 中,int(50)<'2'会导致TypeError,并且确实应该如此。然而,在 python 2.x 中,int(50)<'2'会返回True(其他数字格式也是如此,但int在 py2 和 py3 中都存在)。那么,我的问题有几个部分:

  1. 为什么 Python 2.x (< 3?) 允许这种行为?

    • (一开始谁认为允许这样做是个好主意呢???)
  2. intan小于 a 是什么意思str?

  3. 它指的是ord/吗chr

  4. 是否存在一些不太明显的二进制格式?

  5. '5'在这方面和有区别吗u'5'


阅读 12

收藏
2024-11-14

共1个答案

小能豆

您观察到的这种行为是,Python 2.x 允许整数和字符串之间的比较(如int(50) < '2'),但 Python 3.x 会引发TypeError,这源于 Python 2 和 Python 3 处理类型比较和隐式转换的方式的一些根本差异。让我们分解一下您的问题:

1. 为什么 Python 2.x (< 3) 允许这种行为?

在 Python 2.x 中,语言设计包含一些 Python 3.x 中不允许的隐式类型强制转换。具体来说,Python 2 在某些情况下允许在异质类型(如整数和字符串)之间进行比较,并且会隐式转换它们以进行比较。这是 Python 2 中流行的“鸭子类型”理念的一部分。

当您执行与 Python 2 类似的比较时int(50) < '2',该语言不会立即抛出错误。相反,它会'2'隐式地将字符串转换为整数,然后进行比较。发生这种情况是因为 Python 2 的比较行为更加宽松,试图“理解”不同类型的比较。

在 Python 2 中,这种行为通常出现在混合类型比较中,例如比较整数和浮点数,或比较整数和字符串,其中 Python 2 可能会在执行比较之前强制其中一个操作数(在本例中,将字符串转换为整数)。

2.(一开始谁认为允许这样做是个好主意呢?)

虽然这种行为在 Python 2 中在某些情况下可能很方便,但允许类型之间进行隐式强制转换会导致错误和混乱。例如,将字符串'2'隐式视为数字可能会导致无意的逻辑错误,尤其是在更复杂或模棱两可的情况下。

允许这种行为的决定很可能受到当时 Python 的设计理念的影响,这种理念强调灵活性和易用性(有时以牺牲严格的类型安全性为代价)。然而,随着 Python 的发展,很明显,根本不同的类型(如整数和字符串)之间的隐式类型转换是微妙错误的来源,因此 Python 3 被设计为强制执行更严格的类型安全性并防止此类比较。

int3. an小于 a是什么意思str

在 Python 2.x 中,比较整数和字符串(例如int(50) < '2')涉及隐式转换,但比较的具体含义是什么?

如果将比较视为数字和字符串的比较,则这种比较int(50) < '2'没有太多直观意义,但 Python 2 尝试使其起作用。以下是发生的情况:

  • Python 2 隐式尝试将字符串转换'2'为整数(因为字符串表示数字)。在本例中,'2'成功转换为整数2
  • 然后将整数50与进行比较2,其结果为50 < 2,显然是False

一般来说,当 Python 2 比较整数和字符串时,会将字符串转换为整数(如果可能),然后进行比较。

此行为ord()chr()无关,后者用于在字符和其 ASCII 值之间进行转换。比较有效是因为 Python 2 尝试将字符串解释为数字。

'5'4. 在这方面和有区别吗u'5'

是的,有区别,但它更微妙,并且取决于 Python 2 如何处理 Unicode 字符串。

  • 在 Python 2 中,'5'是字节字符串 ( str),u'5'是 Unicode 字符串 ( unicode)。
  • '5'如果比较涉及混合类型(即比较字节字符串和 Unicode 字符串),则 Python 2 中and的比较u'5'将导致TypeError,因为 Python 2 不会自动将 Unicode 强制转换为常规字符串以进行比较。

但是,如果两者属于同一类型,例如两者都是字节字符串或两者都是 Unicode 字符串,则比较的方式与比较任何其他两个字符串的方式类似。在这种情况下:

  • '5' < '2'将返回False(因为'5'按字典顺序大于'2')。
  • u'5' < u'2'还会回来False

如果 Python 2 允许隐式地比较intandstrintand unicode,您可能会根据字符串的内部编码或它们在内存中的表示方式遇到不同的结果,但 Python 2 不会直接在整数和 Unicode 字符串之间执行隐式转换。因此,在与其他类型交互时,'5'和 的u'5'处理方式不同。

Python 3.x 行为

在 Python 3 中,类型安全性得到了改进,并且删除了字符串与其他类型之间的隐式转换,从而使语言更加可预测。现在,将整数 ( int) 与字符串 ( str) 进行比较会引发TypeError,因为 Python 3 在这种情况下不会尝试强制类型。如果您想在 Python 3 中进行比较50'2'则需要将字符串显式转换'2'为整数 ( int('2')) 或反之亦然。

概括:

  • 为什么 Python 2 允许这样做?因为它允许混合类型比较,在整数和字符串等类型之间执行隐式转换。
  • 这是个好主意吗?事后看来,这导致了令人困惑的行为和潜在的错误,因此 Python 3 对此进行了修改,使类型比较更加严格。
  • intan小于 a 是什么意思str在 Python 2 中,这通常意味着 Python 会尝试将字符串转换为整数(如果可能),然后比较两者。
  • '5'和之间有区别吗u'5'是的,区别在于 Python 2 处理常规字符串 ( str) 和 Unicode 字符串 ( unicode) 的方式,这会影响比较行为。但是,对于简单的字符串比较,两者在 Python 2 中的行为类似。

在 Python 3 中,int和之间的比较str不再被允许,并且会引发TypeError

2024-11-14