gpt4 book ai didi

python - 'is' 运算符在将字符串与空格进行比较时表现不同

转载 作者:IT老高 更新时间:2023-10-28 22:15:18 25 4
gpt4 key购买 nike

我已经开始学习 Python (python 3.3),并且正在尝试 is 运算符。我试过这个:

>>> b = 'is it the space?'
>>> a = 'is it the space?'
>>> a is b
False
>>> c = 'isitthespace'
>>> d = 'isitthespace'
>>> c is d
True
>>> e = 'isitthespace?'
>>> f = 'isitthespace?'
>>> e is f
False

似乎空格和问号使 is 的行为有所不同。怎么回事?

编辑:我知道我应该使用 ==,我只是想知道为什么 is 会这样。

最佳答案

警告:这个答案是关于特定 python 解释器的实现细节。将字符串与 is==bad idea.

进行比较

嗯,至少对于 cpython3.4/2.7.3,答案是“不,它不是空格”。不是只有空格:

  • 如果两个字符串文字是字母数字或位于同一个 block (文件、函数、类或单个解释器命令),则它们将共享内存

  • 当且仅当它是使用常量和二元/一元运算符创建的,并且结果字符串为少于 21 个字符。

  • 单个字符是唯一的。

示例

字母数字字符串总是共享内存:

>>> x='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> y='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> x is y
True

非字母数字字符串当且仅当它们共享封闭句法 block 时共享内存:

(解释器)

>>> x='`!@#$%^&*() \][=-. >:"?<a'; y='`!@#$%^&*() \][=-. >:"?<a';
>>> z='`!@#$%^&*() \][=-. >:"?<a';
>>> x is y
True
>>> x is z
False

(文件)

x='`!@#$%^&*() \][=-. >:"?<a';
y='`!@#$%^&*() \][=-. >:"?<a';
z=(lambda : '`!@#$%^&*() \][=-. >:"?<a')()
print(x is y)
print(x is z)

输出:TrueFalse

对于简单的二进制操作,编译器会进行非常简单的常量传播(参见 peephole.c),但对于字符串,它仅在结果字符串短于 21 个字符时才会这样做。如果是这样的话,前面提到的规则是有效的:

>>> 'a'*10+'a'*10 is 'a'*20
True
>>> 'a'*21 is 'a'*21
False
>>> 'aaaaaaaaaaaaaaaaaaaaa' is 'aaaaaaaa' + 'aaaaaaaaaaaaa'
False
>>> t=2; 'a'*t is 'aa'
False
>>> 'a'.__add__('a') is 'aa'
False
>>> x='a' ; x+='a'; x is 'aa'
False

当然,单个字符总是共享内存:

>>> chr(0x20) is ' '
True

关于python - 'is' 运算符在将字符串与空格进行比较时表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16756699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com