4

我正在编辑一些代码,以便一目了然,我认为我应该将所有代码更改char=="|"char is "|". 我知道这看起来像是我把它弄得太笨了,但它看起来确实更好。无论如何,我决定pycheck最后一次,我收到了这个警告:

Warnings...

test.py:7: Using is |, may not always work
Processing module test (test.py)...

对于我的生活,我无法想象什么时候"|" is "|"会回来False,除非你开始冒险使用多字节字符编码、CJK 字符等,如果我没记错的话。还有其他我错过的情况吗?

4

3 回答 3

13

==将检查两边的值是否相等,但is将检查两个变量是否指向相同的引用。因此,它们都是出于完全不同的目的。例如,

a = "aa"
b = "aa"
print a, b, id(a), id(b)
print a == b
print a is b

在我的机器上输出

aa aa 140634964365520 140634964365520
True
True

因为ab指向相同的字符串数据(字符串在 Python 中是不可变的),python 优化以使用相同的对象。这就是为什么is两人==都回来了True。然而

a = "aa"
b = "aaa"[:2]
print a, b, id(a), id(b)
print a == b
print a is b

在我的机器上输出

aa aa 139680667038464 139680667014248
True
False

虽然ab具有相同的数据(相等),但在内存中它们存储在不同的位置(不同的引用或两个不同的对象)。

所以,永远不要使用is运算符来检查是否相等。

于 2013-11-11T06:13:15.777 回答
7

在 CPython 中,所有单个字符串都是实习的,并且对于相同的字符串(字符)应该始终具有相同的 id

这只是一个实现细节,不应依赖。

几个地方您可能想检查两个字符串的身份是否相同,但您的用例不是其中之一

Python 2.7.2 (1.9+dfsg-1, Jun 19 2012, 23:23:45)
[PyPy 1.9.0 with GCC 4.7.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``"let's not be obscure, unless we
really need to"''
>>>> a = "|"
>>>> a is "|"
False
于 2013-11-11T06:21:54.973 回答
1

我将这里的问题解释为“我实际上在哪里使用'is'来检查事情?”。

当函数的默认命名参数为 None 并且您想查看是否为函数提供了某些内容时,通常使用“is”检查。无总是无。如果他们给出 0 或 [] 或 '',则这些东西评估为 False 的布尔值。

False == 0 == bool('') == bool([]) == bool(None)

返回

True

因此,如果您的函数的用户希望该函数像通常对此类参数一样继续执行,那么检查变量的 bool 不会给您所需的行为。None 就像一个哨兵来检查函数是否有故意提供的参数。当您将变量分配给可变的空容器对象时,此检查特别有用。

例如:

def foo(fn_list=None):
    if fn_list is None:
         fn_list = []
    fn_list.append('foo')
    return fn_list

所以

a is b

与检查相同

id(a) == id(b)

如果评估为 True,它们是同一个对象,因为它们都指向内存中的同一个位置。正如其他人指出的那样,不要使用 is 来检查相等性,因为实现可能会有所不同,并且在语义上,您不关心它是否是同一个对象,您关心的是这两个项目是否相等。

于 2013-11-11T06:51:15.933 回答