¿Por qué el diccionario vacío es un valor predeterminado peligroso en Python? [duplicar]
Esta pregunta ya tiene una respuesta aquí:
- "Menos Asombro" y el Argumento Mutable por Defecto 31 respuestas
- Métodos Python: los valores de los parámetros predeterminados se evalúan una VEZ 3 respuestas
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?
40
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
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
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