【发布时间】:2013-11-07 11:54:47
【问题描述】:
这不是一个实际问题 - 我只是对我观察到的一些奇怪行为感到好奇,想知道我是否正确理解了“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
谁能解释这种奇怪的行为?
【问题讨论】:
-
奇怪的是
True不是保留关键字(或 Python 有的任何关键字)。 -
@iamnotmaynard:
True已成为 Python 3 中的关键字,并且赋值会引发SyntaxError: assignment to keyword。 -
大多数内置插件不是关键字...您可以为几乎所有内置插件重新分配值。幸好它们通常是本地的,所以当一个粗心的程序员在他们的函数中执行它时,它会保持本地化。
-
@CorleyBrigman:例如
id是一个内置函数,但它经常被重新分配为对象属性(例如在 Django ORM 中)。我不确定它是否“粗心”,因为内置的id()除了调试之外没有多大用处。 -
作为对象属性,没关系 - 这不是 C,您将始终以
self.id或object.id(在命名空间中)访问它。虽然我见过(甚至写过)像for id in list_of_uids:这样的代码,所以它很容易做到这一点非常好。
标签: python boolean boolean-expression