(私はあなたの他の質問の質問にすでに答えたので、ここでも少し変更して使用します:)
del
オブジェクトを削除しません。実際、Python では、Python はガベージ コレクトされた言語 (Java、C#、Ruby、Haskell など) であるため、インタープリター/VM にメモリからオブジェクトを削除するように指示することさえできません。
代わりに、del
(辞書のキーやリスト項目ではなく) 変数に対して呼び出された場合は、次のようになります。
del a
つまり、ローカル (またはグローバル) 変数のみが削除され、それが指すものは削除されません(Python のすべての変数は、コンテンツ自体ではなく、そのコンテンツへのポインター/参照を保持します)。実際、ローカルとグローバルは内部でディクショナリとして格納されているため (locals()
およびを参照globals()
)、del a
次と同等です。
del locals()['a']
(またはdel globals()['a']
グローバルに適用された場合。)
あなたが持っている場合:
a = []
b = a
リストを作成し、リストへの参照を保存してから、リストオブジェクト自体をコピー/タッチせずにa
その参照をコピーしています。b
したがって、これら 2 つの呼び出しは、1 つの同じオブジェクトに影響します。
>>> a.append(1)
>>> b.append(2)
>>> a
[1, 2]
>>> b
[1, 2]
>>> a is b # would be False for 2 identical but different list objects
True
>>> id(a) == id(b)
True
(id
オブジェクトのメモリアドレスを返します)
一方、削除は、何を指してb
いるのかに触れることとはまったく関係ありません。b
>>> a = []
>>> b = a
>>> del b # a is still untouched and points to a list
>>> b
NameError: name 'b' is not defined
>>> a
[]