我有一个用于创建对象的类,如下所示:
import copy
import numpy as np
class AnObject(object):
def __init__(self, someValue, anArray):
self.someValue = someValue
self.anArray = anArray
def changeArray(self):
newArray = self.anArray.copy()
ix = np.random.choice(len(self.anArray))
newArray[ix] = newArray[ix] + 0.5
self.anArray = newArray
return self
每个对象都有指定给它们的特定值以及一个名为anArray
的数组。此外,我有一个函数changeArray
,它改变了这个数组的内容;为了简单起见,我在这里只添加0.5到这个数组中的一个值。
现在我有另一个类,我收集所有这些对象以对它们执行某些操作,如下所示:
class AllMyObjects(object):
def __init__(self, name = None):
self.name = name
self.allObjects = []
def addObject(self, anObject):
self.allObjects.append(anObject)
def changeAllMyObjects(self):
# just to express that it is not just a one-time thing but needs to be done several times
for i in xrange(1):
allObjectsCop = copy.deepcopy(self.allObjects)
# this returns None for each object!
allObjectsCop = map(lambda x: x.changeArray(), allObjectsCop)
self.allObjects.extend(allObjectsCop)
单个对象存储在名为allObjects
的列表中,可以向其中添加对象;还可以删除我未显示的对象,以使示例尽可能地保持最小。
现在我想迭代所有对象,使用函数anArray
更改其属性changeArray
,并将所有已更改的数组添加到列表allObjects
。
这很好用:
myObj = AllMyObjects('Test')
myObj.addObject(AnObject(someValue = 1., anArray = np.array([ 1., 2., 3.])))
myObj.addObject(AnObject(someValue = 2., anArray = np.array([ 4., 5., 6.])))
myObj.addObject(AnObject(someValue = 3., anArray = np.array([ 7., 8., 9.])))
myObj.changeAllMyObjects()
for o in xrange(6):
print myObj.allObjects[o].anArray
这给了我想要的输出:
[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]
[ 1.5 2. 3. ]
[ 4. 5. 6.5]
[ 7.5 8. 9. ]
然而,没有
return self
<{1>}中的无法正常工作,如
changeArray
然后只返回map(lambda x: x.changeArray(), allObjectsCop)
。
我的问题是:如果没有None
部分,怎么办呢?如果我只在一个对象上调用return self
,我不希望此函数返回任何内容,但它应该只更改数组。
答案 0 :(得分:1)
map
旨在将某些内容转换为其他内容,然后返回具有更改值的新迭代。因为你想引起副作用,你可以这样做:
for x in l:
x.func()