2016-06-15 21 views
2

私は(CPythonの2.7および3.5)、この動作の理由で何ができるか思ったんだけど:21文字より短いCPythonの文字列 - メモリ割り当て

>>> a = 's' ; b = 's' 
>>> id(a), id(b) 
(4322870976, 4322870976) 

文字列は、同じメモリアドレスを共有しているようです(またはid)。

>>> a = 's' * 20 ; b = 's' * 20 
>>> id(a), id(b) 
(4324218680, 4324218680) 

21から、この動作が変わります。

>>> a = 's' * 21 ; b = 's' * 21 
>>> id(a), id(b) 
(4324218536, 4324218608) 

私は合理的な説明を見つけることができなかったが、python docsに従って:

= 1後例えば、。 B = 1、a、bはあるいは、この決定がなされる場合、私は見つけることができませんでしたcpython's code上で見た後...実装に依存し、値1と同じオブジェクトを

を参照しない場合があります。

答えて

3

Pythonコンパイラconvertsは可能な限り多くの式を持ち、バイトコード内で定数(すなわち、それらをインターンする)に合っています。同じ値を持つ定数はこのプロセスで同じid()になります。これにより、第1および第2の例の結果が得られる。

しかし、私たちは「合理的」である必要があります。大きい表現(例えば、10**100)の結果、一定の結果に多くのスペースが使用されます。これは、コンパイラがバイトコードに変更されていない式を含み、実行時にそれらの値を計算することを意味します。文字列の場合(実際にはすべて型)、最大長は20であるため、3番目の例の式はコンパイラではなくVMによって評価されます。

+0

なぜ20? –

+0

私はそれを見つけることができませんでした。 –