一尘不染

Python字符串实习

python

管这个问题在实际中没有任何实际用途,但我对Python如何进行字符串实习感到好奇。我注意到以下内容。

>> "string" is "string"
>> True
> 

这是我所期望的。

您也可以这样做。

>> "strin"+"g" is "string"
>> True
> 

那真是太聪明了!

但是你不能这样做。

>> s1 = "strin"
>> s2 = "string"
>> s1+"g" is s2
>> False

Python为什么不评估s1+"g",并意识到它s1与指向相同的地址相同?最后一个块到底在做什么False呢?


阅读 309

收藏
2020-02-12

共1个答案

一尘不染

这是特定于实现的,但是你的解释器可能是内部编译时常量,而不是运行时表达式的结果。

接下来,我使用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
2020-02-12