2017-03-13 6 views
0

以下の例を見てください。整数とリストのpythonメモリ管理が異なるのはなぜですか?

>>> a=10 
>>> b=10 
>>> id(a) 
41776876 
>>> id(b) 
41776876 
>>> c=a 
>>> id(c) 
41776876 
>>> d=10 
>>> id(d) 
41776876 

ここで、intの場合、同じオブジェクトは、リストのオブジェクトが変更されるすべての変数を参照しています。

>>> l1=[10] 
>>> l2=[10] 
>>> id(l1) 
42220360 
>>> id(l2) 
52956416 
>>> l3=l1 
>>> id(l3) 
42220360 
>>> l4=[10] 
>>> id(l4) 
52981472 

ここで、私はどのようにパイソンがメモリを管理しているか教えてください。

+0

["is"演算子が整数で予期せず動作する可能性があります](http://stackoverflow.com/questions/306313/is-operator-behaves-unexpectedly-with-integers) – DSM

答えて

0

整数は不変です。複数の整数が同じメモリを共有するかどうかは関係ありません。共有参照にまったく影響を与えない整数には何も起こりません。最適化として、Pythonは小さな整数のキャッシュを保持し、可能であればこれらを再利用します。

リストは変更可能です。 2つの異なるリストが現時点で同じコンテンツを持っているという理由だけで同じメモリに格納されていたとすると、これは悲惨なことになります - 1つのリストの変更は、それらの間の接続が完全に偶然であってもすべてに反映されます。 (l3 = l1のように)同じリストに対して複数の参照を明示的に作成した場合のみ、それらは実際にメモリ内で共有されます。

関連する問題