python 解包如何用一行实例化对象列表

python unpacking How to instantiate a list of object with one-liner

我有类似的对象,我想用来自 class Foobar

的单行实例化
class Foobar():
    
    def __init__(self, path, scale, baz):
        self.path = path
        self.scale = scale
        self.baz = baz

我试过这个:

listobj = [objA, objB, objC] = [Foobar("/picture_foobar.png", 0.5, baz=MAX_CST)]*3

objA, objB, objC = 3*Foobar("/picture_foobar.png", 0.5, baz=MAX_CST)

我得到了:

TypeError: unhashable type: 'list'

还有:

TypeError: unsupported operand type(s) for *: 'int' and 'Foobar'

你不能在这里使用 list 乘法,因为这会给 same 对象(即是 objA is objB is objC,并通过一个名称进行更改,例如 objA.scale = 0.75,将更改所有名称)。你能做的最好的是:

objA, objB, objC = [Foobar("/picture_foobar.png", 0.5, baz=MAX_CST) for _ in range(3)]

它使用一个简单的 listcomp 构造三个不同的 Foobar(具有相同的参数),然后将其解压缩到所讨论的三个对象中的每一个。如果你也需要 list 本身,你可以这样做:

objA, objB, objC = listobj = [Foobar("/picture_foobar.png", 0.5, baz=MAX_CST) for _ in range(3)]

但请注意,listobj 的内容将是您解压到的命名对象的别名(例如 listobj[0] is objAlistobj[1] is objB 等)。