2

(Python 2.7 を使用)

後で入力するテンプレート オブジェクトの複製を作成しようとしています。簡単にするために、次のようにしようとしました。

template={'thing1':'','thing2':'','thing3':''}
for number in some_list:
    pile[number]=template

しかし、後で私がこれをしたとき:

pile[1]['thing1']='blahblah'

また、次の結果になります。

print pile[2]['thing1']
'blahblah'
print template['thing1']
'blahblah'

私が欲しいのは

pile[1]['thing1']='blahblah'

パイル[2]をそのままにしておきます。

print pile[2]['thing1']
''

そして、私が言うとき、問題は

pile[number]=template

これは、pile[1] がテンプレートで、pile[2] がテンプレートであることを意味します。(これは、今日、これに取り組んでいるときに完全に実現したばかりです...そして、実現とその意味がゆっくりと浸透するにつれて、私はそれを大声で何度か繰り返しました...それがPythonの仕組みです、え? The python club. 私は MATLAB を使い始めたので、あまり荒っぽく言わないでください)。

したがって、これには2つの方法があると思います.1つは、オリジナルにリンクされていないオブジェクトの複製、またはそのようなものであり、おそらく非常に単純で明白です。また、キーなどの初期化など、ディクテーションに固有の別の方法があるかもしれません。私は主に最初の種類の答えに興味があります。なぜなら、それはpythonがどのように機能するかについての理解を深めるのに役立つからです、2番目の種類の答えもいいでしょう。ありがとう :)

4

2 に答える 2

3

ディクショナリの浅いコピーを作成する最も簡単な方法は、dict のcopyメソッドを使用することです。

In [1]: template = {'thing1': '', 'thing2': '', 'thing3': ''}

In [2]: apile = template.copy()

In [3]: apile['thing1'] = 1

In [4]: apile
Out[4]: {'thing1': 1, 'thing2': '', 'thing3': ''}

In [5]: template
Out[5]: {'thing1': '', 'thing2': '', 'thing3': ''}

 

リストの浅いコピーを作成するには、リスト全体のスライスを取得できます。

copied_list = original_list[:]

 

他のもののクローンを作成する必要がある場合、または辞書の辞書 (または辞書のリスト、またはその他の変更可能なオブジェクト) のディープ コピーが必要な場合は、次のcopyモジュールを使用する必要があります: http://docs.python.org/2 /library/copy.html

copy.copy(x)

x の浅いコピーを返します。

copy.deepcopy(x)

x のディープ コピーを返します。

浅いコピーと深いコピーの違いは、複合オブジェクト (リストやクラス インスタンスなど、他のオブジェクトを含むオブジェクト) にのみ関係します。

  • 浅いコピーは、新しい複合オブジェクトを構築し、(可能な範囲で) オリジナルで見つかったオブジェクトへの参照を挿入します。
  • ディープ コピーは、新しい複合オブジェクトを構築し、再帰的に、元のオブジェクトで見つかったオブジェクトのコピーを挿入します。

 

2番目の方法について:確かに、別のdictからdictを作成でき、それはコピーになります:

In [23]: p = dict(template)

In [24]: p['thing1'] = 1

In [25]: template
Out[25]: {'thing1': '', 'thing2': '', 'thing3': ''}

In [26]: p
Out[26]: {'thing1': 1, 'thing2': '', 'thing3': ''}
于 2013-03-22T20:03:28.743 に答える
2

これが私の最初の解決策です

import copy

template = {1:''}
d = {}

for n in xrange(10):
    d[n] = copy.deepcopy(template)

しかし、私はパベルの方が好きです。

于 2013-03-22T20:05:19.783 に答える