Is there any difference between passing int
and lambda: 0
as arguments? Or between list
and lambda: []
?
It looks like they do the same thing:
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])]
but are there any cases where they'll have different behavior, or is it merely a notational difference?
The Python defaultdict type behaves almost exactly like a regular Python dictionary, but if you try to access or modify a missing key, then defaultdict will automatically create the key and generate a default value for it. This makes defaultdict a valuable option for handling missing keys in dictionaries.
defaultdict means that if a key is not found in the dictionary, then instead of a KeyError being thrown, a new entry is created. The type of this new entry is given by the argument of defaultdict.
get method and the experiment shows that defaultdict more that two times faster than dict.
A defaultdict works exactly like a normal dict, but it is initialized with a function (“default factory”) that takes no arguments and provides the default value for a nonexistent key. A defaultdict will never raise a KeyError. Any key that does not exist gets the value returned by the default factory.
All that defaultdict
requires is a callable object that will return what should be used as a default value when called with no parameters.
If you were to call the int
constructor, it would return 0
and if you were to call lambda: 0
, it would return 0
. Same with the lists. The only difference here is that the constructor will always use it's logic to create the object. A lambda, you could add additional logic if you chose to do so.
e.g.,
# alternating between `0` and `[]` from itertools import count factory = lambda c=count(): 0 if next(c) % 2 else [] superdict = defaultdict(factory)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With