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

2024-05-23 14:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

用于复制列表:shallow_copy_of_list = old_list[:]

用于复制dict:shallow_copy_of_dict = dict(old_dict)

但是对于一个set,我担心类似的事情不会起作用,因为说new_set = set(old_set)会给出一个集合吗?

但确实有效。所以我把问题和答案贴在这里供参考。以防其他人也有同样的困惑。


Tags: of答案列表new事情olddictlist
2条回答

这两个选项都会给出一个集合的副本:

shallow_copy_of_set = set(old_set)

或:

shallow_copy_of_set = old_set.copy() #Which is more readable.

上面第一种方法没有给出一组集合的原因是,正确的语法应该是set([old_set])。这不起作用,因为sets不能是其他sets中的元素,因为它们是不可更改的。然而,这对于frozensets来说是不正确的,例如frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3])

因此,复制Python中基本数据结构的任何实例(list、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.

注意,只有dictsetfrozenset具有内置的copy()方法。为了统一性和可读性,列表和字符串也有一个copy()方法可能是个好主意。但它们没有,至少在我正在测试的Python2.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.

相关问题 更多 >