2010-02-12 12 views
31

estoy intrigado por la siguiente expresión Python:¿Qué significa `**` en la expresión `dict (d1, ** d2)`?

d3 = dict(d1, **d2) 

La tarea consiste en fusionar los diccionarios 2 en una tercera, y la expresión anterior lleva a cabo la tarea muy bien. Estoy interesado en el operador ** y qué está haciendo exactamente con la expresión. Pensé que ** era el operador de energía y aún no lo había visto en el contexto anterior.

El fragmento de código completo es el siguiente:

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'c': 3, 'd': 4} 
>>> d3 = dict(d1, **d2) 
>>> print d3 
{'a': 1, 'c': 3, 'b': 2, 'd': 4} 
+4

Cabe señalar que GvR piensa que esta expresión es [despreciable] (http://mail.python.org/pipermail/python-dev/2010-April/099459.html) – elhefe

+1

Esto solo funciona si las claves en ' d2' son cadenas, al menos en Python 3. – nobar

+0

Oh, genial, no me di cuenta de que funcionaría en absoluto en Python 2. Supongo que esa es la ventaja de 'dict (d1, ** d2)' over 'dict (** d1, ** d2) 'o' {d1, ** d2} 'o' {** d1, ** d2} '-it funciona en Python 2. Creo que la última es la sintaxis preferida en Python 3 , porque es conciso y consistente. Pero es bueno saber que hay una forma de hacerlo en Python 2, al menos con claves de cadena, incluso si se ve un poco hackish. –

Respuesta

30

** en listas de argumentos tiene un significado especial, como se explica en section 4.7 of the tutorial. El objeto de diccionario (o similar a un diccionario) pasado con **kwargs se expande en argumentos de palabra clave al invocable, al igual que *args se expande en argumentos posicionales separados.

+0

+1: consulte el tutorial. –

+0

Mi pregunta es, ¿por qué usar 'dict (d1, ** d2)' y no 'dict (** d1, ** d2)'. Este último me parece más limpio, y el resultado final parece ser el mismo. ¿Me estoy perdiendo de algo? –

+0

No importa; No me di cuenta de que estábamos hablando de Python 2, donde 'dict (d1, ** d2)' parece ser la única forma. Es bueno saber que incluso es posible.Creo que '{** d1, ** d2}' es la sintaxis preferida en Python 3, ya que es consistente y conciso. –

9

En Python, cualquier función puede aceptar varios argumentos con *;
o múltiple keyword arguments con **.

ejemplo del lado de recepción:

>>> def fn(**kwargs): 
... for kwarg in kwargs: 
...  print kwarg 
... 
>>> fn(a=1,b=2,c=3) 
a 
c 
b 

ejemplo del lado de llamada (gracias Thomas):

>>> mydict = dict(a=1,b=2,c=3) 
>>> fn(**mydict) 
a 
c 
b 
+0

Tenga en cuenta que eso demuestra el lado de recepción, no el lado de la llamada. –

+0

Gracias de nuevo Thomas :-D Agregó el ejemplo del lado que llama. – bernie

7

El ** convierte en el diccionario parámetros de palabras clave:

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'c': 3, 'd': 4} 
>>> d3 = dict(d1, **d2) 

se convierte en:

>>> d3 = dict(d1, c=3, d=4) 
+1

se convierte en 'dict (d1, c = 3, d = 4)' en su lugar. –

+0

Sí, gracias! Sabía lo que quería escribir, pero mis dedos no captaron el mensaje ... –

1

tienes tu respuesta del ** operador. aquí hay otra manera de agregar diccionarios

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'c': 3, 'd': 4} 
>>> d3=d1.copy() 
>>> d3.update(d2) 
>>> d3 
{'a': 1, 'c': 3, 'b': 2, 'd': 4} 
3

También vale la pena mencionar la mecánica del constructor dict. Toma un diccionario inicial como primer argumento y también puede tomar argumentos de palabra clave, cada uno representando un nuevo miembro para agregar al diccionario recién creado.

Cuestiones relacionadas