警告:这个答案是关于特定 python 解释器的实现细节。将字符串与is
== 坏主意进行比较。
好吧,至少对于 cpython3.4/2.7.3,答案是“不,它不是空格”。不仅是空格:
例子
字母数字字符串文字总是共享内存:
>>> x='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> y='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> x is y
True
当且仅当它们共享封闭句法块时,非字母数字字符串文字共享内存:
(翻译)
>>> 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)
输出:True
和False
对于简单的二进制操作,编译器进行非常简单的常量传播(参见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