Ben*_*ris 8 python boolean boolean-expression
这不是一个实际问题 - 我只是对我观察到的一些奇怪的行为感到好奇,并且想知道我是否正确地理解了"is"操作符.
这是一些可预测的Python解释器输出:
>>> True is True
True
>>> (1==1) is True
True
Run Code Online (Sandbox Code Playgroud)
现在让我们定义一个名为True的变量:
>>> True = 'abc'
>>> True == 'abc'
True
>>> True is 'abc'
True
Run Code Online (Sandbox Code Playgroud)
对于布尔运算,解释器仍将返回"True",但布尔运算的结果被认为与"abc"和"True"都不相同.
>>> (1==1)
True
>>> (1==1) is 'abc'
False
>>> (1==1) is True
False
Run Code Online (Sandbox Code Playgroud)
谁能解释这种奇怪的行为?
正如在这里经常发生的那样,我想我在输入问题时想出了答案.
有两个"真":一个是布尔值,另一个是名为True的变量; 最初,他们彼此相等.这就是为什么类似(1 == 1)的布尔运算仍然可以返回True,即使已经改变了名为True的变量 - 它们返回布尔值True.然而,它们不等于"True"变量的新值,它是一个字符串.
发生的事情是命名空间和隐藏它的交互式控制台.
最初你有正常True,这是__builtin__模块的一部分.
重新定义时True,实际上是在当前模块中定义它,在这种情况下,它只是默认模块__main__.
因此,您实际上有两个不同的对象.__builtin__.True和__main__.True.
In [1]: import __builtin__, __main__
In [2]: True = "a bad idea"
In [3]: __main__.True
Out[3]: 'a bad idea'
In [4]: __builtin__.True
Out[4]: True
Run Code Online (Sandbox Code Playgroud)
要在您自己的答案中添加更多内容(应该是评论,但是很长并且需要格式化):
python2.7
...
>>> import __builtin__
>>> id(True)
7744528
>>> id(__builtin__.True)
7744528
>>> True = 'abc'
>>> id(True)
34386540544
Run Code Online (Sandbox Code Playgroud)
from 的值id(本质上)是 Python 中对象的内部标识,或者“真实名称”(如果您愿意的话)。(它实际上是一个 C 指针转换为一个整数。)该is测试比较对象同一性。
>>> 1==1
True
>>> id(1==1)
7744528
Run Code Online (Sandbox Code Playgroud)
这表明比较的布尔结果是“old” True,仍然可用__builtin__.True。
您重新绑定名称__main__.True(解释器提示符处的当前模块>>>是__main__):
>>> True
'abc'
>>> __builtin__.True
True
Run Code Online (Sandbox Code Playgroud)
和:
>>> import __main__
>>> id(__main__.True)
34386540544
>>> __main__.True
'abc'
>>>
Run Code Online (Sandbox Code Playgroud)
当初学者的 Python 程序编写如下函数时,同样的事情经常发生:
def foo(list):
...
Run Code Online (Sandbox Code Playgroud)
list是一个内置函数,但在 function 内部foo,名称已重新绑定到参数。然后在这...部分的某个地方他们得到了一个惊喜:
x = list(y)
Run Code Online (Sandbox Code Playgroud)
他们期望它调用__builtin__.list,但它尝试将其局部变量作为函数调用。
(通过这些名称来调用事物是可能的,但通常不是很好的风格import __builtin__。也可以重新绑定__builtin__名称,但这是一个更糟糕的主意。:-))
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |