¿Por qué el diccionario vacío es un valor predeterminado peligroso en Python? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Pongo llaves vacías como valor predeterminado para un argumento opcional a una función Python, y pylint (usando Sublime package) me dijo que era peligroso. ¿Puede alguien explicar por qué este es el caso? Y es una mejor alternativa para usar Ninguno en su lugar?

Author: tscizzle, 2014-10-12

2 answers

Es peligroso solo si su función modifica el argumento. Si modifica un argumento predeterminado, persistirá hasta la siguiente llamada, por lo que su diccionario "vacío" comenzará a contener valores en llamadas que no sean la primera.

Sí, usar None es seguro y convencional en tales casos.

 51
Author: John Zwinck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-12 01:22:55

Veamos un ejemplo:

def f(value, key, hash={}):
    hash[value] = key
    return hash

print f('a', 1)
print f('b', 2)

Que probablemente espera generar:

{'a': 1}
{'b': 2}

Pero en realidad produce:

{'a': 1}
{'a': 1, 'b': 2}
 60
Author: Bill Lynch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-12 01:26:17