在Python中,“is”操作符是否可以使用两个类似的字符串返回false?

2024-04-26 04:33:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些代码,我正在编辑,使它更容易理解,我认为我应该把char=="|"改成{}。我知道看起来我把它弄得太慢了,但看起来确实更好。无论如何,我最后一次决定pycheck,我得到了这个警告:

Warnings...

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

在我的一生中,我无法想象"|" is "|"会返回{},除非你开始尝试多字节字符编码、CJK字符等,如果我没有错的话。我错过了其他的情况吗?


Tags: 代码pytest编辑警告isnot字符
3条回答

我把这里的问题解释为“我实际上在哪里使用‘is’来检查东西?”。在

“is”检查通常用于函数的默认命名参数为None,并且您希望查看函数是否被赋予了某些内容。没有总是没有。如果它们给出0或[]或“”,则这些值将作为布尔值计算为False。在

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

退货

^{pr2}$

因此,如果函数的用户希望函数像通常那样处理这样的参数,那么检查变量的bool并不能给您提供所需的行为。None就像一个sentinel来检查函数是否得到了有意提供的参数。当您将变量分配给可变的空容器对象时,此检查特别有用。在

例如:

^{3}$

所以

a is b

和检查一样

id(a) == id(b)

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

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

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

在我的机器上输出

^{pr2}$

由于a和{}指向相同的字符串数据(字符串在Python中是不可变的),Python会优化以使用相同的对象。这就是为什么is和{}都返回{}。其中as

^{3}$

在我的机器上输出

aa aa 139680667038464 139680667014248
True
False

尽管a和{}具有相同的数据(相等),但在内存中,它们存储在不同的位置(不同的引用或两个不同的对象)。在

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

在CPython中,所有的单字符字符串都是内联的,对于同一个字符串(character)应该始终具有相同的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

相关问题 更多 >