Dmi*_*nov 2 python dictionary python-2.7
尝试在 Python 2.7.8 中实现以下目标
class X:
pass
a = X()
b = X()
t={1: {1: a, 2: b}}
map(lambda x: setattr(x, 'test', 'wow'), t[1].values())
Run Code Online (Sandbox Code Playgroud)
给出:[None,None],虽然我希望它将每个属性“test”设置为“wow”,如果我在map()之外调用setattr(a,“test”,“wow”)那么一切正常
请查看我答案的底部以获得更好的方法。这是对您的示例中发生的情况的解释(但同样,有更好的方法)。
class X:
pass
a = X()
b = X()
t={1: {1: a, 2: b}}
map(lambda x: setattr(x, 'test', 'wow'), t[1].values())
a.test
> wow
Run Code Online (Sandbox Code Playgroud)
它的行为符合预期。只是setattr返回None(所有没有显式返回值的函数实际上都返回None)。因此map,当您执行此操作时,它会返回None两次,并map返回返回的内容的列表setattr:[None, None]。 map它的副作用是它确实改变了属性,这正是您想要做的,但这不是map返回的结果。为了更清楚地展示行为:
response = setattr(a, 'test', 'wow2')
print response
> None
print a.test
> wow2
Run Code Online (Sandbox Code Playgroud)
为什么不这样做:
for x in t[1].values():
setattr(x, 'test', 'wow')
Run Code Online (Sandbox Code Playgroud)
反而。根本不清楚为什么你需要map. 您的困惑来自于返回列表的事实map,但您想要做的不是获取列表,而是对列表中的每个对象进行一些操作。