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 objA
、listobj[1] is objB
等)。
我有类似的对象,我想用来自 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 objA
、listobj[1] is objB
等)。