Search code examples
python-3.xpython-3.7python-dataclasses

How to initialize Python dataclass 2D list?


Is is possible to create a default initializer to python dataclasses initializing a 2D array, i.e. resulting in the same as

from dataclasses import dataclass, field
from typing import List
MAX = 5
@dataclass
class AlgoData:
    list2D: List[List[int]]  # = ???
    list1D: List[int] = field(default_factory=list)

b = [[] for m in range(MAX)]
a = AlgoData(b)

but without the b argument. Result:

AlgoData(list2D=[[], [], [], [], []], list1D=[])

Solution

  • You can use a lambda function instead as a default_factory for field:

    from dataclasses import dataclass, field
    from typing import List
    MAX = 5
    @dataclass
    class AlgoData:
        list2D: List[List[int]] = field(default_factory=lambda: [[] for m in range(MAX)])
        list1D: List[int] = field(default_factory=list)
    
    a = AlgoData()
    

    a becomes:

    AlgoData(list2D=[[], [], [], [], []], list1D=[])