lista - Cómo clonar o copiar un conjunto en Python?
diccionario python ejemplo (2)
Para copiar una lista: shallow_copy_of_list = old_list[:]
.
Para copiar un dict: shallow_copy_of_dict = dict(old_dict)
.
Pero para un set
, me preocupaba que una cosa similar no funcionara, porque decir new_set = set(old_set)
daría un conjunto de un conjunto?
Pero funciona Así que estoy publicando la pregunta y la respuesta aquí para referencia. En caso de que alguien más tenga la misma confusión.
Además del truco type(x)(x)
, puede importar el módulo de copy
para hacer una copia superficial o una copia profunda:
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]}
Desde el docstring:
Definition: copy.copy(x)
Docstring:
Shallow copy operation on arbitrary Python objects.
Ambos darán un duplicado de un conjunto:
shallow_copy_of_set = set(old_set)
O:
shallow_copy_of_set = old_set.copy() #Which is more readable.
La razón por la cual la primera manera anterior no da un conjunto de un conjunto, es que se establecerá la sintaxis adecuada para eso set([old_set])
. Lo cual no funcionaría, porque los set
s no pueden ser elementos en otros set
, porque son imposibles de ajustar debido a que son mutables. Sin embargo, esto no es cierto para frozenset
s, por ejemplo, frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3])
.
Así que una regla general para replicar cualquier instancia de las estructuras de datos básicos en Python (listas, 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.
Entonces, si x
es cualquiera de esos tipos, entonces
shallow_copy_of_x = type(x)(x) #Highly unreadable! But economical.
Tenga en cuenta que solo dict
, set
y frozenset
tienen incorporado el método copy()
. Probablemente sería una buena idea que las listas y cadenas tuvieran también un método copy()
para uniformidad y legibilidad. Pero no lo hacen, al menos en Python 2.7.3 con el que estoy probando.