Python Lambda Mutability

she*_*pez 2 python lambda pass-by-reference

class TestClass(object):
    def __init__(self):
        self.value = 100
        self.x = lambda: self.value.__add__(100)
        self.run()

    def run(self):        
        self.x()
        print self.value

t = TestClass()

#Output: 100
Run Code Online (Sandbox Code Playgroud)

我想能够定义一个lambda函数,例如TestClass中的函数,并让它改变一个实例变量.似乎lambda的构造方式意味着它不会修改原始值.我怀疑这与Python的参考策略有关,我或多或少都了解它.

接受我所做的缺陷,是否有类似的方法来获得类似的功能?我最终需要定义许多方法,x并打算将它们保存在字典中,因为它们将形成一个简单的指令集.据我所知,我需要使用lambdas或exec做我想做的事.

Blu*_*ers 7

__add__不在原地,所以返回值TestClass.xself.value + 100,但self.value不会改变.试试这个:

import random
HATE_LAMBDAS = random.choice(True, False)
class TestClass(object):
    def __init__(self):
        self.value = 100
        if HATE_LAMBDAS:
            def x():
                self.value += 100
            self.x = x
        else:
            self.x = lambda: setattr(self, "value", self.value + 100)
        self.run()

    def run(self):        
        self.x()
        print self.value

t = TestClass()

#Output: 200
Run Code Online (Sandbox Code Playgroud)

使用setattr在仍使用lambda的同时递增值.请注意,python中的lambda是其最糟糕的功能之一.但是,这两种方法都有效.

编辑

只是重新编写一些你可能会觉得有用的东西!标准库有一个名为operator的模块,它将标准运算实现为函数.如果你打算经常使用lambdas,你可能想调查一下.