可以相互比较的内置 Python 3 类型都有哪些?

     2023-02-21     287

关键词:

【中文标题】可以相互比较的内置 Python 3 类型都有哪些?【英文标题】:What are built-in Python 3 types that can be compared to each other?可以相互比较的内置 Python 3 类型有哪些? 【发布时间】:2019-09-05 18:41:27 【问题描述】:

在 Python 2 中,可以通过隐式比较类型的文本字符串(即按字典顺序,字符串 'int' 小于比字符串'str' 和字符串'list' 小于字符串'tuple')。

因此,在 Python 2 中,5 < 'hello' 返回 True。可以阅读更多关于为什么在回答 Why is ''>0 True in Python? 时允许这样做。

在 Python 3 中,这会引发 builtins.TypeError: unorderable types: int() < str() 异常。

这个web page 说

Python 3 中严格的比较方法使其通常 无法比较不同类型的对象。

这是否意味着有一些内置类型或特殊情况可以比较任何内置类型而不会导致TypeError?我不是在谈论自定义类型,其中实现了必要的 dunder 方法以正确支持比较。

【问题讨论】:

当然,您可以先将intfloat 进行比较。您也可以将它们与bool 进行比较。您还可以将setfrozenset 进行比较。 Python 2 的行为不仅仅是对类型名称进行字符串比较。例如,5 < ArithmeticError() 即使'int' > 'ArithmeticError' 【参考方案1】:

所有这些都是有效的陈述(并且它们都评估为True):

0 < True
0 < 1.
0. < True
0 < frozenset((0, 1))

这里唯一可能看起来很奇怪的是0. == False1. == True

另一方面,您仍然可以通过在比较之前将您的值转换为 str 来重现 python 2 所做的事情(这也评估为 True):

str(5) < 'hello'

如果你真的需要这种行为,你总是可以有一个可以转换/比较的函数。这样你就可以保证不同类型的对象总是以相同的方式进行比较,这似乎是 python 2 中唯一的约束。

def lt(a, b):
    return str(a) < str(b)

或者甚至更好,你可以只在需要时施放:

def lt(a, b):
  try: 
    return a < b
  except TypeError: 
    return str(a) < str(b)

另一方面,正如 cmets 中所建议的,在 CPython 的实现中,似乎是通过以下方式进行比较:

def lt(a, b):
  try: 
    return a < b
  except TypeError: 
    if a is None:
      return True
    if b is None: 
      return False
    if isinstance(a, numbers.Number):
      return True
    if isinstance(b, numbers.Number):
      return False
    return str(type(a)) < str(type(b))

【讨论】:

好的,这很有用。 intbool 的比较在这里讨论 ***.com/questions/2764017/… boolint 的子类,因此您可以将bools 与其他数字进行比较并不奇怪。 Python 2 的行为不等同于str(5) &lt; 'hello'。 Python 2 的行为是一堆奇怪的、依赖于实现的怪癖,但对于 CPython 上 5 &lt; 'hello' 的特定情况,5 被认为更小,因为它是一个数字,而 'hello' 不是。 您可能误解了问题断言值是通过 type 名称进行比较的部分,而不是通过对值进行字符串化。类型名称比较是奇怪的怪癖的一部分,尽管不是全部。 在你的代码中,5'4' 大,这与实际 CPython 2 中的 5 &lt; '4' 不同。【参考方案2】:

我之前已经在网上查过了,除了上面提到的少数特殊情况外,它们似乎在 Python 3 中确实无法排序。

这种变化通常体现在排序列表中:在 Python 3 中,具有不同类型项目的列表通常是不可排序的。 如果您需要对异构列表进行排序,或比较不同类型的对象,请实现一个关键函数来完整描述不同类型应如何排序。Source

我不知道为什么,但有些人找到了使用 Python 3 重现 Python 2 行为的方法。

也许你应该看看this 或that。 This question 也强调了 2011 年的变化:

找到它:埋在 PEP 3100 中:“不同类型之间除 == 和 != 之外的比较将引发异常,除非该类型明确支持”

【讨论】:

python的数据类型都有哪些

...调用类型等几个大类,每个大类里面还有很多小类,详情可以参考:Python常见数据类型 查看详情

python都有哪些数据类型

...两个常见的数据类型转化函数:int和float,一般数据类型可以用来做一些算术功能,如加减乘除乘方等等,还可以用作比较功能,一般返回的是true和false,也就是大于、等于、小于、小于等于诸如此类的有很多,这里就不一一解... 查看详情

python中运算符都有哪些

...比较运算符还支持比较复杂的比较。(1)多条件比较:可以先给变量a赋值,然后做多条件比较。1a=32print(1<a<5)(2)变量的比较:给变量a和变量b分别赋值,进行比较。1a=32b=33print(a!=b)45s1='duwangdan'6s2='DuWangDan'7print(... 查看详情

python内置函数都有哪些

...式、类以及实现了__call__方法的类实例,它都返回True。(可以加括号的都可以调用)8.chr()函数用一个范围在range(256)内(即0~255)的整数作参数,返回一个对应的ASCII数值。9.dict()函数用来将元组/列表转换为字典格式。10.dir()函数... 查看详情

python中的常用内置函数都有哪些呢?

...简单很多。当我们需要创建一个函数来执行单个操作并且可以在一行中编写时,就可以用到匿名函数了。Lamdba的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。利用Lamdba函数,往往可以将代... 查看详情

python中的列表中常用的方法都有哪些,分别是啥作用?

...和最小的元素的方法。列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型。创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。以下是列表最常... 查看详情

java变量类型都有哪些?各自特点?

...te,short,char)——int——long——float——double,低级变量可以直接转换为高级变量,例如,下面的语句可以在Java中直接通过:byteb;inti=b;而将高级变量转换为低级变量时,情况会复杂一些,你可以使用强制类型转换。即你必须采... 查看详情

python语言中都有哪些数据类型

...型有很多,这里为大家简单例举几个:第一种:整数python可以处理任意大小的整数,当然包含负整数,在python程序中,整数的表示方法和数学上的写法一模一样,比如:1,100,-8080,0,等。计算机由于使用二进制,所以有时候用十... 查看详情

python的数据类型都有哪些?

第一种:整数python可以处理任意大小的整数,当然包含负整数,在python程序中,整数的表示方法和数学上的写法一模一样,比如:1,100,-8080,0,等。计算机由于使用二进制,所以有时候用十六进制表示整数比较方便,十六进制用0x... 查看详情

python中的算术运算符都有哪些呢?

...比较运算符还支持比较复杂的比较。(1)多条件比较:可以先给变量a赋值,然后做多条件比较。1a=32print(1<a<5)(2)变量的比较:给变量a和变量b分别赋值,进行比较。1a=32b=33print(a!=b)45s1='duwangdan'6s2='DuWangDan'7print(... 查看详情

python中常量类型都有哪些

参考技术A常量定义:不可以被改变的量python中无固定语法,约定俗成的是将变量名全部大写。例如:PI=3.141592653BIRTH_OF_SYLAR=1990Python并未提供如C/C++/Java一样的const修饰符。换言之,#python中没有常量。python提供了新的方法实现常量... 查看详情

python都有哪些可以做带约束的二次线性规划的包

参考技术A线性规划立足于求满足所有约束条件的最优解,而在实际问题中,可能存在相互矛盾的约束条件.目标规划可以在相互矛盾的约束条件下找到满意解. 查看详情

javascript的引用数据类型都有哪些

...用,即指针。JS基本数据类型:nullundefinednumberbooleanstring比较特殊引用数据类型:functionobjectarrayvara=11;varb=1;b=12;console.log(a);//11a的值不会随b值得改变而改变vara=[1,2,3];varb=a;a[0]=2;console.log(b[0])//2,b的值随着a的值改变而改,因为他们指... 查看详情

android开发框架都有哪些

...FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,我们一行代码就可以对android的sqlite数据库进... 查看详情

python中都有哪些简单的算法?

首先谢谢邀请,python中有的算法还是比较多的?python之所以火是因为人工智能的发展,人工智能的发展离不开算法!感觉有本书比较适合你,不过可惜的是这本书没有电子版,只有纸质的。这本书对于算法从基本的入门到实现,... 查看详情

python库都有哪些

...time,但是它过于简单,使用起来不够方便和智能,而Arrow可以说非常的方便和智能。它可以轻松地定位几个小时之前的时间,可以轻松转换时区时间,对于一个小时前,2个小时之内这样人性化的信息也能够准确解读。2、Behold调... 查看详情

python中内置的数据结构都有啥?

...有区分字符串、整形数字、字符、浮点型的变量,统一都可以直接赋值。比如a="skkk",a=1,a=1.2222等;数组为a=[1,2,3,4];元组也称字典类型为a=1:2,2:3。参考技术A(1)数字(Numbers):int(整型),long(长整型),complex(复数... 查看详情

python中元组常用的方法都有哪些,分别有啥作用?

参考技术Apython元组内置的函数有:1、cmp(tuple1,tuple2):比较两个元组元素。2、len(tuple):计算元组元素个数。3、max(tuple):返回元组中元素最大值。4、min(tuple):返回元组中元素最小值。5、tuple(seq):将列表转换为元组。 查看详情