为什么Python2和Python3的行为不同

车道

在Python2中,它是有效的:

#!/usr/bin/python

class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

a = ListNode(0)
b = ListNode(1)

print(a < b)

输出: True

但是,Python3中的相同代码将引发异常:

#!/usr/bin/python3

class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

a = ListNode(0)
b = ListNode(1)

print(a < b)

引发异常:

Traceback (most recent call last):
  File "c.py", line 11, in <module>
    print(a < b)
TypeError: '<' not supported between instances of 'ListNode' and 'ListNode'

为什么不同?


加:

我可以添加__lt__方法来ListNode避免出现异常:ListNode.__lt__ = lambda a, b: id(a) - id(b)

但是,为什么不需要Python2添加该__lt__方法呢?

暗影游侠

在Python 2中,当您缺少__lt__(或不推荐使用旧版本__cmp__)时,会使用默认的比较规则,在这种情况下,最终会比较出相关对象的内存地址(在此之前,它会将数字放在其他东西之前,并根据类的字符串名称比较其他所有内容)。

但这几乎是没有用的。如果您尚未定义如何排序一个类的实例,那么按内存地址任意排序(每次运行都会改变)会静默地误导99%的代码。

当发生这种情况时,Python 3会大声失败,因此人们不必依赖偶然地对无法分类的事物进行分类;如果有人以未定义的顺序对您的实例进行排序[1, 'a', (), None]甚至只是其中的一个list实例,则引发异常只会更有帮助。如果确实需要内存地址排序,则始终可以像以前一样实现它,但这是一种几乎不常见的用例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么内置函数`any(b'\ x00')`在python2和python3之间的行为不同?

来自分类Dev

为什么在python2和python3中包含路径不同?

来自分类Dev

猴子修补运算符重载在Python2和Python3中的行为不同

来自分类Dev

为什么python2和python3中的print输出使用相同的字符串不同?

来自分类Linux

Python3在Linux中调用Python2多处理的行为与Windows中不同

来自分类Dev

将拆包行为从Python2更改为Python3的过程是什么

来自分类Dev

附加到同一锁的两个条件变量,python2和python3中的行为不同

来自分类Dev

为什么此argparse代码在Python 2和3之间的行为不同?

来自分类Dev

Ansible json_query在python3和python2中的不同结果

来自分类Dev

在Python2和Python3中编写不同的十六进制值

来自分类Python

如何分别为python3和python2设置不同的PYTHONPATH变量

来自分类Dev

pyaudio 在 python2 和 python3 中播放不同的音调

来自分类Dev

为什么python3 pip模块找到了python2库?

来自分类Python

在Pandas DataFrame中选择数据的速度比Python3快Python2 ...为什么?

来自分类Dev

为什么Python3在执行任务时比Python2慢得多?

来自分类Dev

为什么要通过python2运行guake,但错误中存在“ python3”?

来自分类Dev

python2和python3的兼容python文字

来自分类Dev

为什么Python 3的PrettyPrinter的行为与Python 2的不同,我如何获得相同的行为?

来自分类Dev

正确处理Python2和Python3

来自分类Dev

在python2和python3中映射

来自分类Dev

Python2和Python3之间的BeautifulSoup HTMLparsingError

来自分类Dev

Python2和Python3之间的字符编码

来自分类Dev

python2和python3的区别

来自分类Dev

MacOS Catalina 上的两种不同的 Python3 和两种不同的 Python2 安装

来自分类Dev

为什么Python2到Python3转换器将“ items()”放入“列表”?

来自分类Dev

Python3 以不同于 Python2 的方式解析电子邮件正文

来自分类Dev

Python2 vs Python3:从时间戳转换为日期时间时的结果不同

来自分类Dev

Python 2和Python 3在浮点上的行为不同吗?

来自分类Dev

Python2和Python3:__init__和__new__

Related 相关文章

  1. 1

    为什么内置函数`any(b'\ x00')`在python2和python3之间的行为不同?

  2. 2

    为什么在python2和python3中包含路径不同?

  3. 3

    猴子修补运算符重载在Python2和Python3中的行为不同

  4. 4

    为什么python2和python3中的print输出使用相同的字符串不同?

  5. 5

    Python3在Linux中调用Python2多处理的行为与Windows中不同

  6. 6

    将拆包行为从Python2更改为Python3的过程是什么

  7. 7

    附加到同一锁的两个条件变量,python2和python3中的行为不同

  8. 8

    为什么此argparse代码在Python 2和3之间的行为不同?

  9. 9

    Ansible json_query在python3和python2中的不同结果

  10. 10

    在Python2和Python3中编写不同的十六进制值

  11. 11

    如何分别为python3和python2设置不同的PYTHONPATH变量

  12. 12

    pyaudio 在 python2 和 python3 中播放不同的音调

  13. 13

    为什么python3 pip模块找到了python2库?

  14. 14

    在Pandas DataFrame中选择数据的速度比Python3快Python2 ...为什么?

  15. 15

    为什么Python3在执行任务时比Python2慢得多?

  16. 16

    为什么要通过python2运行guake,但错误中存在“ python3”?

  17. 17

    python2和python3的兼容python文字

  18. 18

    为什么Python 3的PrettyPrinter的行为与Python 2的不同,我如何获得相同的行为?

  19. 19

    正确处理Python2和Python3

  20. 20

    在python2和python3中映射

  21. 21

    Python2和Python3之间的BeautifulSoup HTMLparsingError

  22. 22

    Python2和Python3之间的字符编码

  23. 23

    python2和python3的区别

  24. 24

    MacOS Catalina 上的两种不同的 Python3 和两种不同的 Python2 安装

  25. 25

    为什么Python2到Python3转换器将“ items()”放入“列表”?

  26. 26

    Python3 以不同于 Python2 的方式解析电子邮件正文

  27. 27

    Python2 vs Python3:从时间戳转换为日期时间时的结果不同

  28. 28

    Python 2和Python 3在浮点上的行为不同吗?

  29. 29

    Python2和Python3:__init__和__new__

热门标签

归档