web-dev-qa-db-ja.com

Python変数のメモリアドレスを出力します

Python 2.7の変数のメモリアドレスを印刷するにはどうすればよいですか? id()が変数またはオブジェクトの 'id'を返すことは知っていますが、これは、メモリアドレスに対して予想される0x3357e182スタイルを返しません。私はprint &xのようなことをしたいのですが、xは例えばC++ int変数です。 Pythonでこれを行うにはどうすればよいですか?

63
brno792

idは使用するメソッドです。16進数に変換するには:

hex(id(variable_here))

例えば:

x = 4
print hex(id(x))

私にくれた:

0x9cf10c

どちらが欲しいですか?

(面白いことに、2つの変数を同じintにバインドすると、同じメモリアドレスが使用される可能性があります。)
試してください:

x = 4
y = 4
w = 9999
v = 9999
a = 12345678
b = 12345678
print hex(id(x))
print hex(id(y))
print hex(id(w))
print hex(id(v))
print hex(id(a))
print hex(id(b))

これにより、大きな整数であっても同一のペアが得られました。

121
BlackVegetable

一般的にPython 2.7の値のメモリアドレスを取得する方法はありません。 JythonまたはPyPyでは、実装は値のアドレスさえも知りません(そして、それが同じ場所にとどまるという保証すらありません。例えば、ガベージコレクターは必要に応じて移動できます)。

ただし、CPythonだけに関心がある場合は、 id はすでにアドレスを返しています。唯一の問題がその整数を特定の方法でフォーマットする方法である場合...any整数のフォーマットと同じです:

>>> hex(33)
0x21
>>> '{:#010x}'.format(33) # 32-bit
0x00000021
>>> '{:#018x}'.format(33) # 64-bit
0x0000000000000021

… 等々。

ただし、この理由はほとんどありません。実際にオブジェクトのアドレスが必要な場合は、おそらくctypesなどに渡す必要があります。その場合は、ctypes.addressofなどを使用する必要があります。

8
abarnert

マニュアル によると、CPythonではid()は変数の実際のメモリアドレスです。 16進形式で使用する場合は、hex()を呼び出します。

x = 5
print hex(id(x))

これにより、xのメモリアドレスが出力されます。

6
Jonathan