Python 使用map和setattr函数动态设置对象属性
尝试在Python2.7.8中实现以下功能Python 使用map和setattr函数动态设置对象属性,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,尝试在Python2.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()) 这就给出了:[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())
这就给出了:[None,None],而我希望它将每个属性的“test”设置为“wow”
如果我在map()之外调用setattr(a,'test','wow'),那么一切都会正常运行请查看我答案的底部,以找到更好的方法。下面是对您的示例中发生的情况的解释(但是,还有更好的方法) 它的行为符合预期。只是
setattr
返回None
(所有没有显式返回值的函数实际上都返回None
)。因此,当您map
it时,它会同时返回None
,并且map
会返回setattr
返回的内容列表:[None,None]
<代码>映射的副作用是它确实会更改属性,这是您试图做的,但这不是映射
返回的结果。要更清楚地演示该行为,请执行以下操作:
response = setattr(a, 'test', 'wow2')
print response
> None
print a.test
> wow2
为什么不:
for x in t[1].values():
setattr(x, 'test', 'wow')
相反。根本不清楚为什么需要
map
。您的困惑是因为map
返回一个列表,但您试图做的不是获取列表,而是对列表中的每个对象执行一些操作。请查看我答案的底部,以获得更好的方法。下面是对您的示例中发生的情况的解释(但是,还有更好的方法)
它的行为符合预期。只是setattr
返回None
(所有没有显式返回值的函数实际上都返回None
)。因此,当您map
it时,它会同时返回None
,并且map
会返回setattr
返回的内容列表:[None,None]
<代码>映射的副作用是它确实会更改属性,这是您试图做的,但这不是映射
返回的结果。要更清楚地演示该行为,请执行以下操作:
response = setattr(a, 'test', 'wow2')
print response
> None
print a.test
> wow2
为什么不:
for x in t[1].values():
setattr(x, 'test', 'wow')
相反。根本不清楚为什么需要
map
。您的困惑源于map
返回一个列表,但您试图做的不是获取列表,而是对列表中的每个对象执行一些操作。它确实将test
属性设置为“哇”。到底是什么不起作用?使用map
有什么意义?为什么不使用普通for循环呢?它会将test
属性设置为“哇”。到底是什么不起作用?使用map
有什么意义?为什么不使用普通for循环呢?这在python 3中没有,需要用list()包装映射。在python 3中没有,需要用list()包装映射