这是特定于实现的,但是你的解释器可能是内部编译时常量,而不是运行时表达式的结果。
接下来,我使用CPython 2.7.3。
在第二个示例中,表达式
"strin"+"g"在编译时求值,并替换为
"string"。这使得前两个示例的行为相同。
如果我们检查字节码,我们会发现它们完全相同:
# s1 = "string" 20 LOAD_ConST 1 ('string') 3 STORE_FAST 0 (s1) # s2 = "strin" + "g" 36 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



