代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

为什么指定为“真/假”不按我的预期工作?

  •  31
  • paxdiablo  · 技术社区  · 15 年前

    作为回答另一个问题的一部分,我写了以下代码,其行为乍一看似乎很奇怪:

    print True                    # outputs true
    True = False;    print True   # outputs false
    True = True;     print True   # outputs false
    True = not True; print True   # outputs true
    

    有人能解释这种奇怪的行为吗?我认为这与Python的对象模型有关,但我不确定。

    这是Cygwin的2.5.2版。

    5 回复  |  直到 8 年前
        1
  •  74
  •   balpha    15 年前

    Python有这两个(以及其他)内置对象。它们只是物体,一开始还没有名字,但为了知道我们指的是什么,我们叫它们 0x600D 0xBAD .

    在开始执行python(2.x)脚本之前, True 绑定到对象 0x600 D 和名字 False 绑定到对象 0xBad ,所以当程序引用 它看着 0x600 D .

    因为 0x600 D 0xBad 知道他们通常被名字所使用 ,这就是它们打印时输出的内容,即 __str__ 方法 0x600天 收益率 'True' 等等。

    True = False
    

    现在绑定名称 到另一个对象。从现在起,两个名字 引用同一对象 0xBad ,打印时输出 .

    True = True
    

    实际上不做任何事情:它接受由名称引用的对象 并绑定新(和旧)名称 到这个对象。自(因为上一步) 0xBad 在此之前,它仍然指 0xBad 此后。因此,打印仍然输出 .

    True = not True
    

    首先获取名为 是绑定到的,即 0xBad . 它将这个对象 not 操作员。 不在乎(或不知道)这里指的是什么名字 0xBad 它只知道当给予 0坏 它应该会回来 0x600天 . 然后将返回值赋给赋值运算符 = ,绑定名称 这个对象。

    自名以来 现在又一次提到这个物体 0x600 D 呼唤 print True 输出 世界又变好了。

        2
  •  42
  •   James    15 年前

    想象一下:

    A = True
    B = False
    
    print A           # true
    A = B;  print A   # false
    A = A;  print A   # false, because A is still false from before
    A = not A; print A # true, because A was false, so not A is true
    

    完全相同的事情正在发生,但在您的版本中,这是令人困惑的,因为您不期望您可以重新定义正确和错误。

        3
  •  18
  •   Ignacio Vazquez-Abrams    15 年前

    在2.x中,true和false不是关键字,因此可以用这种方式隐藏内置项。

        4
  •  12
  •   Peter Mortensen icecrime    15 年前

    您可以检查“真/假”是否是关键字:

    >>> import keyword
    >>> keyword.iskeyword('True')
    False
    

    因为它不是(在我的版本中),所以指定true=false就意味着“true”是另一个“variable”名称。

        5
  •  0
  •   Byte Commander    9 年前

    您可以使用简单的布尔比较轻松地还原原始值:

    True = 1==1
    False = 1==0
    

    或者通过将整型文本转换为bools:

    True = bool(1)  # actually every number except 0 works
    False = bool(0)
    
    推荐文章