Ответ 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, с которым я тестирую.