尽管这个问题在实际中没有任何实际用途,但我对Python如何进行字符串实习感到好奇。我注意到以下内容。
>> "string" is "string"
>> True
这是我所期望的。
您也可以这样做。
>> "strin"+"g" is "string"
>> True
那真是太聪明了!
但是你不能这样做。
>> s1 = "strin"
>> s2 = "string"
>> s1+"g" is s2
>> False
Python为什么不评估
s1+"g"
并意识到它与s1
相同并将其指向相同的地址?最后一个块到底在做什么,以使其返回False
? 最佳答案
这是特定于实现的,但是您的解释器可能是内部编译时常量,而不是运行时表达式的结果。
接下来,我使用CPython 2.7.3。
在第二个示例中,表达式"strin"+"g"
在编译时求值,并替换为"string"
。这使得前两个示例的行为相同。
如果我们检查字节码,我们会发现它们完全相同:
# s1 = "string"
2 0 LOAD_CONST 1 ('string')
3 STORE_FAST 0 (s1)
# s2 = "strin" + "g"
3 6 LOAD_CONST 4 ('string')
9 STORE_FAST 1 (s2)
第三个示例涉及运行时串联,其结果不会自动中断:
# s3a = "strin"
# s3 = s3a + "g"
4 12 LOAD_CONST 2 ('strin')
15 STORE_FAST 2 (s3a)
5 18 LOAD_FAST 2 (s3a)
21 LOAD_CONST 3 ('g')
24 BINARY_ADD
25 STORE_FAST 3 (s3)
28 LOAD_CONST 0 (None)
31 RETURN_VALUE
如果要手动
intern()
第三个表达式的结果,则将获得与以前相同的对象:>>> s3a = "strin"
>>> s3 = s3a + "g"
>>> s3 is "string"
False
>>> intern(s3) is "string"
True
关于python - Python字符串实习,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58347968/