2

辞書をコピーすると、両方が同じディレクトリを指しているため、一方を変更すると他方が影響を受けるが、リストの場合はそうではない理由を誰かに教えてもらえますか?

彼らが辞書をある方法で設定し、別の方法でリストする理由の背後にある論理に興味があります。紛らわしいので、その背後にある理由を知っていれば、おそらく覚えているでしょう.

dict = {'Dog' : 'der Hund' , 'Cat' : 'die Katze' , 'Bird' : 'der Vogel'}
otherdict = dict
dict.clear()
print otherdict

その結果、otherdict = {} になります。したがって、両方の辞書が同じディレクトリを指しています。しかし、これはリストには当てはまりません。

list = ['one' , 'two' , 'three']
newlist = list
list = list + ['four']
print newlist

newlist はまだ古いリストを保持しています。したがって、それらは同じディレクトリを指していません。それらが異なる理由の背後にある理論的根拠を知りたいですか?

4

4 に答える 4

4

あなたと同様の意図を持ついくつかのコードは、あるリストへの変更が他の参照に影響を与えることを示しています。

>>> list = ['one' , 'two' , 'three']
>>> newlist = list
>>> list.append('four')
>>> print newlist
['one', 'two', 'three', 'four']

これは、辞書コードに最も近いアナロジーです。元のオブジェクトでメソッドを呼び出します。

違いは、コードで別のプラスと代入演算子を使用したことです

list = list + ['four']

これは 2 つの別個の操作です。まず、インタプリタは式を評価しますlist + ['four']。その計算の結果を新しいリスト オブジェクトに入れる必要があります。これは、結果をリストに代入することを想定していないためです。と言っていother_list = list + ['four']たら、リストが変更されたら非常にイライラするでしょう。

の結果を含む新しいオブジェクトができましたlist + ['four']。その新しいオブジェクトが list に割り当てられます。list は新しいオブジェクトへの参照になりましたが、newlist は古いオブジェクトへの参照のままです。

これでも違う

list += ['four']

+= は、オブジェクトをその場で変更するという可変オブジェクトの意味を持ちます。

于 2013-06-17T03:26:24.303 に答える
4

あなたの 2 つのケースは、コピーしているオブジェクトに対して異なることを行っているため、異なる結果が表示されます。

まず、あなたは本当にそれらをコピーしていません。単に新しい「参照」を作成するか、(より Python 用語で) 新しい名前を同じオブジェクトにバインドします。

辞書では、dict.clearすべての内容を破棄する を呼び出しています。これにより既存のオブジェクトが変更されるため、それに対する両方の参照を通じて結果が表示されます。

リストでは、名前の 1 つを新しいリストに再バインドしています。この新しいリストは、変更されていない古いリストと同じではありません。

必要に応じて、リストを使用して辞書コードの動作を再作成できます。スライスの割り当ては、リスト全体を一度に変更する 1 つの方法です。

old_list[:] = [] # empties the list in place

上記の主な問題とは関係のない 1 つの補遺:dictやのような名前listを独自のコードで変数として使用することは非常に悪い考えです。これは、組み込みの Python ディクショナリとリスト タイプの名前だからです。同じ名前を使用すると、組み込みのものを隠し、混乱を招くバグにつながる可能性があります。

于 2013-06-17T03:27:11.047 に答える
3

辞書の例では、辞書を作成して に保存しましたdict。次に、同じ参照を に保存しotherdictます。と の両方が同じ辞書dictotherdict指すようになりました*. 次に、 を呼び出しますdict.clear()dictこれにより、との両方がotherdict指す辞書がクリアされます。

リストの例では、リストを作成して に保存しましたlist。次に、同じ参照を に保存しotherlistます。次にlist、 の要素と別の要素で構成される新しいリストを作成し、新しいリストを に保存listます。作成した元のリストを変更していません。新しいリストを作成し、指すものを変更しlistました。

list.append('four')代わりにlist = list + ['four'].

于 2013-06-17T03:24:29.257 に答える
1

これのことですか?

>>> d = {'test1': 1, 'test2': 2}
>>> new_d = d
>>> new_d['test3'] = 3
>>> new_d
{'test1': 1, 'test3': 3, 'test2': 2}
>>> d # copied over
{'test1': 1, 'test3': 3, 'test2': 2}
>>> lst = [1, 2, 3]
>>> new_lst = lst
>>> new_lst.append(5)
>>> new_lst
[1, 2, 3, 5]
>>> lst # copied over
[1, 2, 3, 5]
>>> new_lst += [5]
>>> lst # copied over
[1, 2, 3, 5, 5]
>>> my_tuple = (1, 2, 3)
>>> new_my_tuple = my_tuple
>>> new_my_tuple += (5,)
>>> new_my_tuple
(1, 2, 3, 5)
>>> my_tuple # immutable, so it is not affected by new_my_tuple
(1, 2, 3)

リストは、オブジェクト自体ではなく、参照を渡します。ほとんどの (すべてとは言いません) 変更可能な (リストや辞書など、変更できる) オブジェクトは参照を渡しますが、不変 (タプルなど、変更できない) オブジェクトはオブジェクト自体を渡します。

于 2013-06-17T02:54:22.167 に答える