16

在 Python 中,是否有可能以列表理解或类似方式更新对象列表?例如,我想设置列表中所有对象的属性:

result = [ object.name = "blah" for object in objects]

或带map功能

result = map(object.name = "blah", objects)

如果不使用属性设置进行循环,是否可以实现?

(注:以上所有示例均为故意错误,仅用于表达想法)

4

1 回答 1

39

归根结底,赋值是“语句”,而不是“表达式”,因此不能在 lambda 表达式或列表推导中使用。你需要一个常规函数来完成你正在尝试的事情。

有一个内置函数可以做到这一点(返回列表None):

[setattr(obj,'name','blah') for obj in objects]

请不要使用它。只需使用一个循环。 我怀疑您是否会注意到效率上的任何差异,并且循环更加清晰。

如果你真的需要一个 1-liner(虽然我不明白为什么):

for obj in objects: obj.name = "blah"

我发现大多数人都想使用列表理解,因为有人告诉他们他们“很快”。这是正确的,但仅用于创建新列表。对副作用使用列表推导不太可能带来任何性能优势,并且您的代码将在可读性方面受到影响。实际上,使用列表推导而不是等效循环的最重要原因.append是因为它更易于阅读。

于 2013-05-20T13:19:15.067 回答