要为您自己的答案添加更多内容(应该是评论,但是很长并且需要格式化):
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
是一个内置函数,但在 function 内部foo
,名称已重新绑定到参数。然后在该...
部分的某个地方,他们得到了一个惊喜:
x = list(y)
他们希望 this 调用__builtin__.list
,但它尝试将其局部变量作为函数调用。
(有可能,但通常不是很好的风格,import __builtin__
而是通过这些名称来调用事物。也可以重新绑定__builtin__
名称,但这是一个更糟糕的主意。:-))