2024-04-20 04:42:44 发布
网友
作为回答另一个问题的一部分,我写了以下代码,其行为乍一看似乎很奇怪:
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版本。
在2.x中,True和False不是关键字,因此可以用这种方式隐藏内置项。
Python有这两个(以及其他)内置对象。它们只是对象;在开始时,它们还没有任何名称,但是要知道我们指的是什么,让我们称它们为0x600D和0xBAD。
0x600D
0xBAD
在开始执行Python(2.x)脚本之前,名称True绑定到对象0x600D,名称False绑定到对象0xBAD,因此当程序引用True时,它会查看0x600D。
True
False
因为0x600D和0xBAD知道它们通常由名称True和False使用,这就是它们在打印时输出的内容,即0x600D的__str__方法返回'True'等等。
__str__
'True'
True = False
现在将名称True绑定到另一个对象。从现在起,名称True和False都引用同一个对象0xBAD,打印时,该对象将输出False。
True = True
不会真正执行任何操作:它接受由名称True引用的对象,并将新(和旧)名称True绑定到此对象。因为(因为前面的步骤)True在此之前指的是0xBAD,所以在此之后它仍然指的是0xBAD。因此,打印仍然输出False。
True = not True
首先获取名称True绑定到的对象,即0xBAD。它将此对象赋给not运算符。not不关心(或知道)这里使用什么名称来指代0xBAD,它只知道当给定0xBAD时,它应该返回0x600D。然后将此返回值赋给赋值运算符=,并将名称True绑定到此对象。
not
=
由于名称True现在再次引用对象0x600D,调用print True输出True,世界再次美好起来。
print 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
同样的事情也在发生,但在你的版本中,它是令人困惑的,因为你不期望你能重新定义真和假。
在2.x中,True和False不是关键字,因此可以用这种方式隐藏内置项。
Python有这两个(以及其他)内置对象。它们只是对象;在开始时,它们还没有任何名称,但是要知道我们指的是什么,让我们称它们为
0x600D
和0xBAD
。在开始执行Python(2.x)脚本之前,名称
True
绑定到对象0x600D
,名称False
绑定到对象0xBAD
,因此当程序引用True
时,它会查看0x600D
。因为
0x600D
和0xBAD
知道它们通常由名称True
和False
使用,这就是它们在打印时输出的内容,即0x600D
的__str__
方法返回'True'
等等。现在将名称
True
绑定到另一个对象。从现在起,名称True
和False
都引用同一个对象0xBAD
,打印时,该对象将输出False
。不会真正执行任何操作:它接受由名称
True
引用的对象,并将新(和旧)名称True
绑定到此对象。因为(因为前面的步骤)True
在此之前指的是0xBAD
,所以在此之后它仍然指的是0xBAD
。因此,打印仍然输出False
。首先获取名称
True
绑定到的对象,即0xBAD
。它将此对象赋给not
运算符。not
不关心(或知道)这里使用什么名称来指代0xBAD
,它只知道当给定0xBAD
时,它应该返回0x600D
。然后将此返回值赋给赋值运算符=
,并将名称True
绑定到此对象。由于名称
True
现在再次引用对象0x600D
,调用print True
输出True
,世界再次美好起来。想象一下:
同样的事情也在发生,但在你的版本中,它是令人困惑的,因为你不期望你能重新定义真和假。
相关问题 更多 >
编程相关推荐