如何使用地图改变对象?

时间:2015-10-27 16:38:53

标签: python arrays python-2.7 object

我有一个用于创建对象的类,如下所示:

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,我不希望此函数返回任何内容,但它应该只更改数组。

1 个答案:

答案 0 :(得分:1)

map旨在将某些内容转换为其他内容,然后返回具有更改值的新迭代。因为你想引起副作用,你可以这样做:

for x in l:
    x.func()