这不是一个实际的问题-我只是对观察到的某些奇怪行为感到好奇,并想知道我是否正确理解“ is”运算符。
这是一些可预测的Python解释器输出:
>>> True is True
True
>>> (1==1) is True
True
现在让我们定义一个名为True的变量:
>>> True = 'abc'
>>> True == 'abc'
True
>>> True is 'abc'
True
对于布尔运算,解释器仍将返回“ True”,但是布尔运算的结果被认为既不等于“ abc”也不等于True。
>>> (1==1)
True
>>> (1==1) is 'abc'
False
>>> (1==1) is True
False
谁能解释这个奇怪的行为?
要在您自己的答案中添加更多内容(应为注释,但很长,需要格式化):
python2.7
...
>>> import __builtin__
>>> id(True)
7744528
>>> id(__builtin__.True)
7744528
>>> True = 'abc'
>>> id(True)
34386540544
from的值id
(本质上)是Python对象的内部标识或“真名”(如果您愿意)。(实际上是一个C指针变成了一个整数。)该is
测试比较对象身份。
>>> 1==1
True
>>> id(1==1)
7744528
这表明比较的布尔结果是“旧” True
,仍可作为__builtin__.True
。
您重新绑定了名称__main__.True
(您在解释器>>>
提示符下的当前模块是__main__
):
>>> True
'abc'
>>> __builtin__.True
True
和:
>>> import __main__
>>> id(__main__.True)
34386540544
>>> __main__.True
'abc'
>>>
在初学者的Python程序中,当他们编写如下函数时,经常会发生相同的事情:
def foo(list):
...
list
是内置函数,但在函数内部foo
,名称已重新绑定到参数。然后在...
零件的某个地方,他们会感到惊讶:
x = list(y)
他们希望此方法可以调用__builtin__.list
,但是它尝试将其局部变量作为函数调用。
(有可能,但通常不是好的样式,import __builtin__
而是通过这些名称来调用事物。也可以重新绑定__builtin__
名称,但这是一个更糟糕的主意。:-))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句