not name python collections defaultdict

name - modulo collections python



python defaultdict: 0 vs. int y[] vs lista (1)

¿Hay alguna diferencia entre pasar int y lambda: 0 como argumentos? O entre list y lambda: [] ?

Parece que hacen lo mismo:

from collections import defaultdict dint1 = defaultdict(lambda: 0) dint2 = defaultdict(int) dlist1 = defaultdict(lambda: []) dlist2 = defaultdict(list) for ch in ''abracadabra'': dint1[ch] += 1 dint2[ch] += 1 dlist1[ch].append(1) dlist2[ch].append(1) print dint1.items() print dint2.items() print dlist1.items() print dlist2.items() ## -- Output: -- [(''a'', 5), (''r'', 2), (''b'', 2), (''c'', 1), (''d'', 1)] [(''a'', 5), (''r'', 2), (''b'', 2), (''c'', 1), (''d'', 1)] [(''a'', [1, 1, 1, 1, 1]), (''r'', [1, 1]), (''b'', [1, 1]), (''c'', [1]), (''d'', [1])] [(''a'', [1, 1, 1, 1, 1]), (''r'', [1, 1]), (''b'', [1, 1]), (''c'', [1]), (''d'', [1])]

pero ¿hay casos en los que tengan un comportamiento diferente, o es simplemente una diferencia de notación?


Todo lo que requiere defaultdict es un objeto invocable que devolverá lo que debe usarse como valor predeterminado cuando se llama sin parámetros.

Si llamara al constructor int , devolvería 0 y si llamara lambda: 0 , devolvería 0 . Lo mismo con las listas. La única diferencia aquí es que el constructor siempre usará su lógica para crear el objeto. Un lambda, podría agregar lógica adicional si elige hacerlo.

p.ej,

# alternating between `0` and `[]` from itertools import count factory = lambda c=count(): 0 if next(c) % 2 else [] superdict = defaultdict(factory)