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)