Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

666
Views
defaultdict : first argument must be callable or None

I ran the following code :

from collections import defaultdict
lst = list(range(0,5))
d = defaultdict(lst)

and I got this error :

TypeError: first argument must be callable or None

Please help

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

For a defaultdict the default value is usually not really a value, it a factory: a method that generates a new value. You can solve this issue by using a lambda expression that generates a list:

lst = lambda:list(range(0,5))
d = defaultdict(lst)

This is also a good idea here, since otherwise all default values would reference the same list. For instance here:

d[1].append(14)

will not have impact on d[2] (given both d[1] and d[2] did not exist).

You can however achieve this with:

val = list(range(0,5))
lst = lambda:val
d = defaultdict(lst)

But this can have unwanted side effects: if you here perform d[1].append(14) then d[2] will be [1,2,3,4,5,14] and d[1] is d[2] will be True:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import defaultdict
>>> val = list(range(0,5))
>>> lst = lambda:val
>>> d = defaultdict(lst)
>>> d[1]
[0, 1, 2, 3, 4]
>>> d[1].append(14)
>>> d[2]
[0, 1, 2, 3, 4, 14]
>>> d[1] is d[2]
True

whereas:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import defaultdict
>>> lst = lambda:list(range(0,5))
>>> d = defaultdict(lst)
>>> d[1]
[0, 1, 2, 3, 4]
>>> d[1].append(14)
>>> d[2]
[0, 1, 2, 3, 4]
>>> d[1] is d[2]
False
over 4 years ago · Santiago Trujillo Report

0

You should make the parameter a callable, say, using lambda:

from collections import defaultdict

d = defaultdict(lambda: list(range(0,5)))
print(d[0])
# [0, 1, 2, 3, 4]
over 4 years ago · Santiago Trujillo Report

0

Default dictionary accepts callable as first argument(which is default factory for not defined values), so what you want to do is the next step:

from collections import defaultdict


default_factory = (lambda: list(range(0,5))
d = defaultdict(default_factory)

See more about callable in What is a "callable" in Python? SO question.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!