复制列表:shallow_copy_of_list = old_list[:]
。
复制字典:shallow_copy_of_dict = dict(old_dict)
。
但是对于一个set
,我担心类似的事情会起作用,因为说new_set = set(old_set)
会给出一套一套?
但确实有效。所以我在这里发布问题和答案以供参考。如果其他人有同样的困惑。
答案 0 :(得分:48)
这两个都会给出一组副本:
shallow_copy_of_set = set(old_set)
或者:
shallow_copy_of_set = old_set.copy() #Which is more readable.
上面第一条>>给出一组集合的原因是,正确的语法是set([old_set])
。哪个不起作用,因为set
s不能是其他set
中的元素,因为它们由于是可变的而不可删除。但是,对于frozenset
s,情况并非如此,例如frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3])
。
因此,在Python中复制任何基本数据结构实例的经验法则(列表,字典,集合,冻结集,字符串):
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中。
答案 1 :(得分:8)
除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.