许多教程都说
“
“
然而,我发现Python的doc说:
“
似乎
那么我应该使用
==
比较运算符用于值相等,就像这个answer中的引用所示:“
==
用于值相等。当您想知道两个对象是否具有相同的值时,请使用它。”“
is
用于引用相等。当您想知道两个引用是否指向同一个对象时,请使用它。”然而,我发现Python的doc说:
“
x==y
调用x.__eq__(y)
。默认情况下,object
通过使用is
实现__eq__()
,在假比较的情况下返回NotImplemented
: True if x is y else NotImplemented
。”似乎
==
运算符的默认行为是像 is
运算符一样比较引用质量,这与这些教程所说的相矛盾。那么我应该使用
==
来做什么呢?值相等还是引用相等?还是取决于如何实现 __eq__
方法。
我认为值比较的文档已经清楚地阐述了这个问题:
<
,>
,==
,>=
,<=
和!=
运算符比较两个对象的值。在Python中,一个对象的值是一个相当抽象的概念。比较运算符实现了一个特定的对象值的概念。人们可以将它们视为通过比较实现对象值间接定义的手段。
默认情况下,对象的等值比较(默认相等比较的行为即不同标识的实例总是不相等,与那些需要合理定义对象值和基于值相等性的类型的需求可能相矛盾。这样的类型将需要自定义它们的比较行为,事实上,许多内置类型已经这样做了。
==
和!=
)基于对象的标识。因此,具有相同标识的实例之间的等值比较结果为相等,而具有不同标识的实例之间的等值比较结果为不相等。此默认行为的动机是希望所有对象都应该是自反的(即x is y
意味着x == y
)。此外,它还包括一个列表,描述了最重要的内置类型(如数字、字符串和序列等)的比较行为。
a is 1
在 Python 3.9 中会引发SyntaxWarning
。 - Daniel HepperSyntaxWarning
,很不错。根据快速测试,似乎在使用Python 3.8时,当代码中出现a is 1
时会生成该警告。 - Chrisa is 1
返回了True
,我认为这是因为Python有一个缓存池用于常见的整数,比如1
,它们只会被创建一次。 - oeter