有没有时间用python中的两个类似的字符串”is”运算符可以返回false?

is there a time when the `is` operator can return false with two similar strings in Python?

本问题已经有最佳答案,请猛点这里访问。

我编辑了一些代码,让它看起来更容易理解,我想我应该把所有的char=="|"都改成char is"|"。我知道这看起来像是我把它减得太小了,但看起来确实更好。不管怎么说,我最后一次决定去pycheck,我得到了这个警告:

1
2
3
4
Warnings...

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

在我的一生中,我无法想象,如果我没有错的话,除非你开始冒险使用多字节字符编码、CJK字符等,否则"|" is"|"将返回False。还有其他我错过的情况吗?


如果两个变量都指向相同的参照点,则Will check if values on both the sides are equal,but is所以,他们都是为了完全不同的目的。For example,

1
2
3
4
5
a ="aa"
b ="aa"
print a, b, id(a), id(b)
print a == b
print a is b

机器输出

ZZU1

自从ab以来,一直指向同一条弦数据(弦在Python中是不可用的),Python优化使用相同的对象。这就是为什么要恢复True。在哪里

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

机器输出

1
2
3
aa aa 139680667038464 139680667014248
True
False

尽管有同样的数据(平等),在记忆中,它们存储在不同的位置(不同的参考或两个不同的对象)。

从不使用EDOCX1&1


在CPYTHON中,所有单个字符串都是互相关联的,并且应该总是有相同字符串的相同标识(字符串)

这只是一个详细的执行情况,不应与之联系起来。

你可能想要检查两条弦乐的身份的地方也有,但你的用法不是其中之一。

1
2
3
4
5
6
7
8
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


我把这个问题解释为"我实际用的是什么东西?"页:1

"是"检验是典型的,当一个缺陷名称为函数的论据是不存在的,你想知道是否给了函数什么东西。没有总是没有。如果他们给了0或[……]或",那么这些东西将被评定为一个错误的起点。

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

Returns

1
True

如果你的函数的使用者想要函数运行的话,那么检查变量的书籍不会给你想要的行为。如果函数有一个有意提供的论据,则非行为如哨兵检查。这是当你指定变量为一个可变形的容器物体时特别有用的检查。

E.G.:

1
2
3
4
5
def foo(fn_list=None):
    if fn_list is None:
         fn_list = []
    fn_list.append('foo')
    return fn_list

So

1
a is b

和检查一样

1
id(a) == id(b)

如果评估是真的,他们是同样的目标,因为他们都是在记忆中的同一个位置。当其他人指向外界时,不要利用平等检验,因为执行可能会变,而且无论如何,如果这是一个相同的目标,你就不在乎,无论两个项目是否等值。