以下は私にとって理にかなっています:
>>> [] is []
False
[]
リストが変更可能であることを考えると、式に現れるたびに新しい空のリスト オブジェクトになることが予想されます。しかし、この説明を使用すると、次のことに驚かされます。
id([]) == id([])
True
なんで?説明は何ですか?
以下は私にとって理にかなっています:
>>> [] is []
False
[]
リストが変更可能であることを考えると、式に現れるたびに新しい空のリスト オブジェクトになることが予想されます。しかし、この説明を使用すると、次のことに驚かされます。
id([]) == id([])
True
なんで?説明は何ですか?
最初の例では、リストが変更可能であるため正確で[]
はありません。そうでない場合は、問題なく同じものに安全にマップできます。[]
2 番目の例でid([])
は、リストを作成し、ID を取得して、リストの割り当てを解除します。2 回目は再びリストを作成しますが、他に何も起こらなかったため、「同じ場所に配置」します。id
オブジェクトの存続期間中のみ有効であり、この場合、その存続期間は事実上ゼロです
idのドキュメントから:
これは、このオブジェクトの有効期間中に一意で一定であることが保証されている整数 (または長整数) です。有効期間が重複しない 2 つのオブジェクトは、同じ id() 値を持つ場合があります。
コメント付きの分解:
0 LOAD_GLOBAL 0 (id) # load the id function
3 BUILD_LIST 0 # create the first list
6 CALL_FUNCTION 1 # get the id
9 LOAD_GLOBAL 0 (id) # load the id function
12 BUILD_LIST 0 # create the second list
15 CALL_FUNCTION 1 # get the id
18 COMPARE_OP 2 (==) # compare the two ids
21 RETURN_VALUE # return the comparison
STORE_FAST
リストを保持する必要がないことに注意してください。id
したがって、関数に渡された直後に破棄されました。