为什么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

select()在python2和python3上的行为是否有所不同?

来自分类Dev

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

来自分类Dev

从抽象基类继承时,为什么__slots__在Python 2和3中的行为不同

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么此脚本在python3中比在python2中花费更多的时间?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

python2和python3中dict的__repr __()

来自分类Dev

正确处理Python2和Python3

来自分类Dev

Python2和Python3之间的字符编码

来自分类Dev

正确处理Python2和Python3

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Python2和Python3:__init__和__new__

来自分类Dev

Python3和pip3 +为python2安装的轮子也可以用于python3

来自分类Dev

使用新的python插件时,如何告诉snapcraft将我的代码运行为python2而不是python3?

来自分类Dev

使用python2和python3在stderr上编写的函数

来自分类Dev

python2和python3之间的可移植元类

来自分类Dev

以与python2和python3兼容的方式将字节写入标准输出

来自分类Dev

使用python2和python3创建一个virtualenv

来自分类Dev

Python3和Python2之间的区别-socket.send数据

来自分类Dev

捕获标准输出时python2和python3之间的StringIO可移植性

来自分类Dev

python2和python3之间的可移植元类

来自分类Dev

使用 python3 和 python2 构建分发包的区别?

来自分类Dev

使用多个 Pipfiles 支持 python2 和 python3

Related 相关文章

  1. 1

    select()在python2和python3上的行为是否有所不同?

  2. 2

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

  3. 3

    从抽象基类继承时,为什么__slots__在Python 2和3中的行为不同

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

    为什么此脚本在python3中比在python2中花费更多的时间?

  10. 10

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

  11. 11

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

  12. 12

    python2和python3中dict的__repr __()

  13. 13

    正确处理Python2和Python3

  14. 14

    Python2和Python3之间的字符编码

  15. 15

    正确处理Python2和Python3

  16. 16

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

  17. 17

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

  18. 18

    Python2和Python3:__init__和__new__

  19. 19

    Python3和pip3 +为python2安装的轮子也可以用于python3

  20. 20

    使用新的python插件时,如何告诉snapcraft将我的代码运行为python2而不是python3?

  21. 21

    使用python2和python3在stderr上编写的函数

  22. 22

    python2和python3之间的可移植元类

  23. 23

    以与python2和python3兼容的方式将字节写入标准输出

  24. 24

    使用python2和python3创建一个virtualenv

  25. 25

    Python3和Python2之间的区别-socket.send数据

  26. 26

    捕获标准输出时python2和python3之间的StringIO可移植性

  27. 27

    python2和python3之间的可移植元类

  28. 28

    使用 python3 和 python2 构建分发包的区别?

  29. 29

    使用多个 Pipfiles 支持 python2 和 python3

热门标签

归档