Python语句:有时是True,有时是False.为什么?

Ale*_*ley 3 python boolean behavior python-2.7

我希望在Python中更好地理解OOP并编写一些描述(无限)序数算术的代码.我所定义的命名的类Omega()与通常的比较运算符(==,<=等),加法和乘法.

我想我会检查(应该是真的)添加到自身的第一个无限序数是否小于或等于第一个不可数序数.启动交互式shell,这是我发现的:

    >>> a, b = Omega(), Omega(1)
    >>> (a+a) <= b
    False
    >>> (a+a) <= b
    True
    >>> (a+a) <= b
    False
Run Code Online (Sandbox Code Playgroud)

相同的表达式产生不同的真值.

我继续测试表达式,无法发现任何模式.如果我重新解释代码,我发现重复测试表达式会产生不同的True/ False值序列.

什么可能导致这种行为?

如果它是相关的,我在Windows 8.1上使用CPython 2.7.5.

这是我运行的Python代码:http://pastebin.com/XPqMphBw

Adr*_*ano 6

我相信你超载了<=>=运营商不正确.代替:

def __leq__(self, other):
# ...
def __geq__(self, other):
Run Code Online (Sandbox Code Playgroud)

改用它:

def __le__(self, other):
# ...
def __ge__(self, other):
Run Code Online (Sandbox Code Playgroud)

进行这些更改并在Python 3.4.1中运行后,我得到:

>>> a, b = Omega(), Omega(1)
>>> (a+a) <= b
True
>>> (a+a) <= b
True
>>> (a+a) <= b
True
Run Code Online (Sandbox Code Playgroud)

  • 一种猜测.由于`__geq__`不是特殊名称,因此实际上_did not_define是一个比较运算符.在这种情况下,Python 2.x基于对象标识返回随机垃圾; 你通过计算"a + a"来生成新的瞬态对象,并且其中一些与"b"以不同方式"比较".没有排序运算符的Python 3.x清楚地说'type <whatever>是无法解决的''. (3认同)