1

次のコードが両方の変数を変更するのはなぜですか:

>>> a = []
>>> b = a
>>> a.append(9)
>>> a
[9]
>>> b
[9]
>>> 

しかし、delステートメントは同じ効果を達成しませんか?

>>> a = []
>>> b = a
>>> del(a)
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> b
[]
>>> 
4

4 に答える 4

2

あなたがするとき:

a = b

あなたがしていることは、ラベルが参照bしているのと同じオブジェクトにラベルを割り当てることですa

あなたがするとき:

a.append(9)

9の両方が指すリスト オブジェクトに追加しています。同じオブジェクトなので、同じ結果が表示されます。ab

あなたがするとき:

del a

オブジェクト自体ではなく、オブジェクトへの参照を削除しています。それが唯一の参照である場合、オブジェクトはガベージ コレクションされます。しかし、あなたの場合、別の参照があるbため、オブジェクトは引き続き存在します。

于 2014-04-30T00:17:59.307 に答える
0

appendメソッドは実際のオブジェクトに対して機能しますdelが、参照、つまり変数名に対して機能します。

于 2014-04-30T00:17:47.000 に答える
0

(私はあなたの他の質問の質問にすでに答えたので、ここでも少し変更して使用します:)

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
[]
于 2014-04-30T10:40:37.600 に答える