6

そのような

In [9]: dis.disassemble(compile("s = '123' + '456'", "<execfile>", "exec"))
  1           0 LOAD_CONST               3 ('123456')
              3 STORE_NAME               0 (s)
              6 LOAD_CONST               2 (None)
              9 RETURN_VALUE 

知りたいのですが、Pythonはいつ定数文字列を。として結合しますかCONST。可能であれば、cpython(2.x、3.x)でこれに関するソースコードを教えてください。

4

2 に答える 2

11

結合された文字列が 20 文字以下の場合に発生します。

最適化は、ピープホール オプティマイザーで行われます。Python/peephole.cfold_binops_on_constants()の関数の 219 行目を参照してください: http://hg.python.org/cpython/file/cd87afe18ff8/Python/peephole.c#l149

于 2013-01-24T03:19:14.327 に答える
4

@Raymond Hettingの答えは素晴らしいです、それに投票してください(私はしました)。これをコメントにしますが、コメントでコードをフォーマットすることはできません。

20 文字の制限を超えると、逆アセンブリは次のようになります。

>>> dis.disassemble(compile("s = '1234567890' + '09876543210'", "<execfile>", "exec"))
  1  0 LOAD_CONST  0 ('1234567890')
     3 LOAD_CONST  1 ('09876543210')
     6 BINARY_ADD
     7 STORE_NAME  0 (s)

ただし、2 つの文字列リテラルがある場合は、を省略して文字列リテラルの連結+を使用して、BINARY_ADD を回避できることを覚えておいてください(結合された文字列の長さが 20 を超える場合でも)。

>>> dis.disassemble(compile("s = '1234567890' '09876543210'", "<execfile>", "exec"))
  1  0 LOAD_CONST  0 ('123456789009876543210')
     3 STORE_NAME  0 (s)
于 2013-01-24T03:49:42.467 に答える