How to clone or copy a set in Python?

后端 未结 2 1586
忘了有多久
忘了有多久 2020-12-18 17:47

For copying a list: shallow_copy_of_list = old_list[:].

For copying a dict: shallow_copy_of_dict = dict(old_dict).

But for a

2条回答
  •  自闭症患者
    2020-12-18 18:15

    Both of these will give a duplicate of a set:

    shallow_copy_of_set = set(old_set)
    

    Or:

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

    The reason that the first way above doesn't give a set of a set, is that the proper syntax for that would be set([old_set]). Which wouldn't work, because sets can't be elements in other sets, because they are unhashable by virtue of being mutable. However, this isn't true for frozensets, so e.g. frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3]).

    So a rule of thumb for replicating any of instance of the basic data structures in 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.
    

    So, if x is either of those types, then

    shallow_copy_of_x = type(x)(x) #Highly unreadable! But economical.
    

    Note that only dict, set and frozenset have the built-in copy() method. It would probably be a good idea that lists and strings had a copy() method too, for uniformity and readability. But they don't, at least in Python 2.7.3 which I'm testing with.

提交回复
热议问题