Ответ 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