2017-07-06 5 views
4

なぜ配列要素のIDが変更を続けますか? 配列要素のIDがIPythonで変化する

IPython Screenshot

この

In [43]: x = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
    In [44]: print id(x[0]) 
    30836416 
    In [45]: print id(x[0]) 
    31121344 
    In [46]: print id(x[0]) 
    31471808 
はPythonスクリプトで記述されたとき、我々が Python script screenshot

し、また他の観測は以下である同じIDを取得するPythonスクリプト で書かれている場合ではありません図 Behaviour when printed ID of copy of the array for the same element

aCopyは配列aのコピーです。 両方の配列の同じ要素のidが2回出力されます。 出力によれば、すべての配列要素のidは で、同じ配列であっても異なっていても(コピー)、FIRST印刷以外は同じです。 なぜ2つの異なる配列の同じ要素のIDが同じですか? IDが複数回印刷されると、そのIDが異なるのはなぜですか?

+4

スクリーンショットを投稿しないでください。テキストをコピーして貼り付けてください。 – Julien

+4

@Divakar 'id'が組み込まれています... – Julien

+1

あなたの例では、Python(2または3)のインタプリタを使用するとidは変わりません。 –

答えて

1

id() CPythonの戻り値は、引数のメモリアドレスに基づいています。

プログラムで印刷するときに何も起こらないので、毎回新しく作成されたオブジェクトであるx[0]の結果に対して同じアドレスが再利用される可能性が高くなります。それは印刷後にゴミ収集されます。

一方、IPythonでは、各ユーザの入力は履歴に永続的に格納されるため、プリント間にオブジェクトが作成されるため、同じメモリアドレスにオブジェクトが配置されにくくなります。

IPythonで一度に2枚のプリントを行うとき、私は両方のオブジェクトに同じIDを取得

が、私はこれを行うたびに異なる1:もちろん

In [28]: print id(x[0]); print id(x[0]) 
140000637403008 
140000637403008 

In [29]: print id(x[0]); print id(x[0]) 
140000637402608 
140000637402608 

In [30]: print id(x[0]); print id(x[0]) 
140000637402928 
140000637402928 

これはどちらか保証されません。

1

id(x[0])は、x.__getitem__(0)によって作成されたオブジェクトのポインタです。このオブジェクトは、あなたがこれを呼び出すたびにnumpyコードで作成され、可能なキャッシングとは別のものが異なります。最初の配列要素を表すのは、x.dataのバイトのidではありません。 arrayストレージは価値のあるものです。リスト記憶は参照によって、すなわちe。ポインタ。

これは重複した質問ですが、正しいSOリンクを見つけることは難しいかもしれません。オブジェクトの「アイデンティティ」に戻るid

用のPythonドキュメントから

。これは、そのオブジェクトの存続期間中に一意で定数であることが保証されている整数です。存続期間が重複しない2つのオブジェクトは、同じid()値を持つことがあります。

idを繰り返す場合は、non-overlapping lifetimesをチェックしてください。

関連する問題