Python 如何将函数应用于列表的元素?

Python 如何将函数应用于列表的元素?,python,list,map,python-2.7,Python,List,Map,Python 2.7,我想将函数应用于列表中的所有元素,但我想实际更改元素(它们是对象),而不是查看结果。我认为这就是使用map()或列表理解的问题所在 class Thing(object): pass # some collection of things my_things # they are all big... # produces SyntaxError: invalid syntax [i.size = "big" for i in my_things] # produces Synt

我想将函数应用于列表中的所有元素,但我想实际更改元素(它们是对象),而不是查看结果。我认为这就是使用
map()
或列表理解的问题所在

class Thing(object):
    pass

# some collection of things
my_things

# they are all big...

# produces SyntaxError: invalid syntax
[i.size = "big" for i in my_things]

# produces SyntaxError: lambda cannot contain assignment
map(lambda i: i.size="big", [i for i in my_things]) 

# no error, but is it the preferred way?
for i in my_things:
    i.size="big"
这样做的方法是什么

我认为这就是使用map()或列表理解的问题所在

class Thing(object):
    pass

# some collection of things
my_things

# they are all big...

# produces SyntaxError: invalid syntax
[i.size = "big" for i in my_things]

# produces SyntaxError: lambda cannot contain assignment
map(lambda i: i.size="big", [i for i in my_things]) 

# no error, but is it the preferred way?
for i in my_things:
    i.size="big"
不完全是

my_things[:] = map(...)
你怎么了

for i in my_things:
    i.size = "big"

您既不想使用
map
也不想使用列表压缩,因为它们实际上创建了新的列表。您不需要这种开销,是吗?

您可以使用
\uuu setattr\uuu
方法在列表中分配属性。虽然,根据一些SO线程,在不使用输出的情况下使用列表理解不是pythonic

[i.__setattr__('size', 'big') for i in my_things]

虽然我同意这没有什么错

for i in my_things:
    i.size = "big"
有些人热衷于python一行程序

一个选项是向类中添加一个set方法,然后可以从lambda调用该方法(实际上是将赋值隐藏在函数中):


也许像python3上这样:

[dict(**i.__dict__, size='big') for i in my_things]

如果我不反对

[dict(**i, size='big') for i in my_things]
关于蟒蛇2

[dict(i.copy(), size='big') for i in my_things]  # isinstance(i, dict)
[dict(i.__dict__.copy(), size='big') for i in my_things]  # isinstance(i, object)

我不知道地图上有一个新的列表,这让人有些惊讶。@lukecampbell它必须。:)考虑这个例子:<代码> x= [-1,1] 和<代码> MAP(lambda i:i> 0,x)< /代码>。然后再次查看
x
。它一点也没变<代码>地图已创建新列表。而且总是这样。地图会创建新的列表吗?我真不敢相信我没有考虑过。最好不要在这里引入新变量
i
(或者使用
\u
),我喜欢这个答案。有时最简单的答案就是最好的答案。这仍然会创建一个新的列表!!没错,但这不是一个要求。鉴于对象的按引用性质,它也将更改原始列表中的对象。
[dict(i.copy(), size='big') for i in my_things]  # isinstance(i, dict)
[dict(i.__dict__.copy(), size='big') for i in my_things]  # isinstance(i, object)