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 を共有していました。