为什么赋值为真/假并不像我期望的那样工作?

2024-04-20 04:42:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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版本。


Tags: 对象代码模型版本falsetruenotoutputs
3条回答

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

Python有这两个(以及其他)内置对象。它们只是对象;在开始时,它们还没有任何名称,但是要知道我们指的是什么,让我们称它们为0x600D0xBAD

在开始执行Python(2.x)脚本之前,名称True绑定到对象0x600D,名称False绑定到对象0xBAD,因此当程序引用True时,它会查看0x600D

因为0x600D0xBAD知道它们通常由名称TrueFalse使用,这就是它们在打印时输出的内容,即0x600D__str__方法返回'True'等等。

True = False

现在将名称True绑定到另一个对象。从现在起,名称TrueFalse都引用同一个对象0xBAD,打印时,该对象将输出False

True = True

不会真正执行任何操作:它接受由名称True引用的对象,并将新(和旧)名称True绑定到此对象。因为(因为前面的步骤)True在此之前指的是0xBAD,所以在此之后它仍然指的是0xBAD。因此,打印仍然输出False

True = not True

首先获取名称True绑定到的对象,即0xBAD。它将此对象赋给not运算符。not不关心(或知道)这里使用什么名称来指代0xBAD,它只知道当给定0xBAD时,它应该返回0x600D。然后将此返回值赋给赋值运算符=,并将名称True绑定到此对象。

由于名称True现在再次引用对象0x600D,调用print True输出True,世界再次美好起来。

想象一下:

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

同样的事情也在发生,但在你的版本中,它是令人困惑的,因为你不期望你能重新定义真和假。

相关问题 更多 >