1

Python 3.3 for Windowsでは、リストが作成されると、すべてのリストが異なるIDを取得します。

>>> id([3])
46555784
>>> id([3])
47920192
>>> id([4])
46532048

しかし、2つのリストのIDを要求するタプルを作成すると、各リストは同じIDを取得しているように見えます。

>>> id([3]), id([4])
(43079000, 43079000)

2つの異なるIDを持つタプルを期待していました。この動作の理由は何ですか?

4

1 に答える 1

1

Python 3.3 id Documentationによると、CPython の id はオブジェクトのメモリ アドレスを示します。

私が次のことをしようとしたとき:

print(id([3]))
print(id([4]))
print(id([5]))
print((id([3]), id([4])))

リストごとに同じメモリアドレスを取得しました。

ただし、次の場合:

print(id([3]))
print(id([4]))
print(id([5]))
i = [3]
j = [4]
print((id(i), id(j)))

最初の 3 つの print ステートメントとタプルの最初の ID は同じでしたが、タプルの 2 番目の ID は異なっていました。2 つの異なるオブジェクトが作成されて割り当てられ、 ID が取得されるため、これは理にかなっています。

しかし、あなたの投稿が示唆するように、これらはインタラクティブモードではなくPythonスクリプトにありました。ただし、インタラクティブモードでも実質的に同じ結果が得られました。

したがって、あなたの質問に答えるために、インタープリター配列を呼び出し間で異なる場所に割り当てているようです。しかし、タプルを宣言すると、割り当てられたように見え、id を取得し、解放し、割り当て、id を取得して解放し、たまたま同じ場所になります。

配列を宣言しなかった場合、またはネストされた配列がない場合、すべて同じ id の結果が得られるという Blender のコメントをエコーし​​ていました。

私がこのようなことを試したとき:

print(id([3]), id([3]))
print(id([3]), id([3,[3]]))

最初の印刷ステートメント ID は同じ ID 結果を持っていましたが、2 番目の印刷ステートメント ID は異なっていましたが、ID の 1 つは最初の印刷ステートメントと同じ ID を共有していました。

于 2013-04-23T14:01:47.530 に答える