Подтвердить что ты не робот

Как клонировать или копировать набор в Python?

Для копирования списка: shallow_copy_of_list = old_list[:].

Для копирования dict: shallow_copy_of_dict = dict(old_dict).

Но для a set я был обеспокоен тем, что подобное не сработает, потому что выражение new_set = set(old_set) даст набор множеств?

Но он действительно работает. Поэтому я размещаю вопрос и отвечу здесь для справки. В случае, если кто-то еще имеет ту же путаницу.

4b9b3361

Ответ 1

Оба из них дадут дубликат набора:

shallow_copy_of_set = set(old_set)

Или:

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

Причина, по которой первый путь выше не дает набор наборов, заключается в том, что для этого синтаксиса будет set([old_set]). Это не сработало бы, потому что set не может быть элементами в других set s, потому что они не сотрясаются из-за того, что они изменяемы. Однако это не относится к frozenset s, так, например, frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3]).

Итак, эмпирическое правило для тиражирования любого экземпляра базовых структур данных в Python (списки, 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, с которым я тестирую.

Ответ 2

Помимо тэга 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.