operaciones lista ejemplo diccionarios diccionario copiar con python set clone shallow-copy

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.