如何在Python中克隆或复制集合?

Evg*_*eev 48 python clone set shallow-copy

复制列表:shallow_copy_of_list = old_list[:].

复制词典:shallow_copy_of_dict = dict(old_dict).

但是对于a set,我担心类似的东西不起作用,因为说new_set = set(old_set)会给出一套一套?

但它确实有效.所以我在这里发布问题和答案以供参考.如果其他人有同样的困惑.

Evg*_*eev 53

这两个都会给出一组副本:

shallow_copy_of_set = set(old_set)
Run Code Online (Sandbox Code Playgroud)

要么:

shallow_copy_of_set = old_set.copy() #Which is more readable.
Run Code Online (Sandbox Code Playgroud)

上面第一种方法没有给出一组集合的原因是它的正确语法是set([old_set]).哪个不起作用,因为sets不能是其他sets中的元素,因为它们由于可变而不可用.但是,对于frozensets来说这不是真的,例如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.
Run Code Online (Sandbox Code Playgroud)

那么,如果x是这些类型中的任何一种,那么

shallow_copy_of_x = type(x)(x) #Highly unreadable! But economical.
Run Code Online (Sandbox Code Playgroud)

请注意,只有dict,setfrozenset具有内置的copy()方法.copy()为了统一性和可读性,列表和字符串也有一个方法可能是个好主意.但是他们没有,至少在我正在测试的Python 2.7.3中.


zha*_*hen 10

除了type(x)(x)hack之外,您还可以导入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]}
Run Code Online (Sandbox Code Playgroud)

从文档字符串:

Definition: copy.copy(x)
Docstring:
Shallow copy operation on arbitrary Python objects.
Run Code Online (Sandbox Code Playgroud)