リストをコピーする場合:_shallow_copy_of_list = old_list[:]
_。
辞書をコピーする場合:shallow_copy_of_dict = dict(old_dict)
。
しかし、set
については、new_set = set(old_set)
がセットのセットを与えると言うので、同様のことがうまくいかないのではないかと心配しました。
しかし、それは機能します。そこで、参考のためにここに質問と回答を投稿しています。他の誰かが同じ混乱を持っている場合。
これらは両方ともセットの複製を提供します:
_shallow_copy_of_set = set(old_set)
_
または:
_shallow_copy_of_set = old_set.copy() #Which is more readable.
_
上記の最初の方法does n'tがセットのセットを与える理由は、そのための適切な構文がset([old_set])
になるからです。 set
sは他のset
sの要素にはなれません。なぜなら、それらは可変であるためにハッシュできないからです。ただし、これはfrozenset
sには当てはまりません。 frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3])
。
したがって、Python(lists、dict、set、frozenset、string)の基本データ構造のインスタンスのいずれかを複製するための経験則:
_a2 = list(a) #a is a list
b2 = set(b) #b is a set
c2 = dict(c) #c is a dict
d2 = frozenset(d) #d is a frozenset
e2 = str(e) #e is a string
#All of the above give a (shallow) copy.
_
したがって、x
がこれらのタイプの場合、
_shallow_copy_of_x = type(x)(x) #Highly unreadable! But economical.
_
dict
、set
、およびfrozenset
のみにcopy()
メソッドが組み込まれていることに注意してください。均一性と読みやすさのために、リストと文字列にもcopy()
メソッドが含まれているとよいでしょう。しかし、少なくともPython 2.7.3でテストしています。
type(x)(x)
ハックの他に、copy
モジュールをインポートして、浅いコピーまたは深いコピーを作成できます。
In [29]: d={1: [2,3]}
In [30]: sd=copy.copy(d)
...: sd[1][0]=321
...: print d
{1: [321, 3]}
In [31]: dd=copy.deepcopy(d)
...: dd[1][0]=987
...: print dd, d
{1: [987, 3]} {1: [321, 3]}
Docstringから:
Definition: copy.copy(x)
Docstring:
Shallow copy operation on arbitrary Python objects.