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

问题描述

我有类似的对象,我想用 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,objC = 3*Foobar("/picture_foobar.png",baz=MAX_CST)

我得到了:

TypeError: unhashable type: 'list'

还有:

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

解决方法

您不能在这里使用 list 乘法,因为这会使 相同 对象(即 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,objC = listobj = [Foobar("/picture_foobar.png",baz=MAX_CST) for _ in range(3)]

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