¿Qué significa `**` en la expresión `dict (d1, ** d2)`?

Estoy intrigado por la siguiente expresión de python:

d3 = dict(d1, **d2) 

La tarea es fusionar 2 diccionarios en un tercero, y la expresión anterior realiza 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 he visto en el contexto anterior.

El fragmento completo de código es este:

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

** en las listas de argumentos tiene un significado especial, como se describe en la sección 4.7 del tutorial . El objeto de diccionario (o similar a diccionario) pasado con **kwargs se expande en argumentos de palabra clave al llamable, al igual que *args se expande en argumentos posicionales separados.

El ** convierte el diccionario en 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) 

En Python, cualquier función puede aceptar múltiples argumentos con *;
o múltiples argumentos de palabras clave con **.

Ejemplo del lado receptor:

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

Ejemplo del lado de la llamada (gracias Thomas):

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

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

Ese operador se usa para desempaquetar la lista de argumentos: http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists

Tienes tu respuesta del operador **. Aquí hay otra forma 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}