对象列表功能不起作用

本杰明

对不起,标题,希望它能正确反映我的问题:

在以下代码中,我期望结果为结果0 1 2,但我得到的结果为2 22。my_function内部的代码似乎是用obj的最后一个实例解释的怎么了 ?

class Example:
    def __init__(self, x):
        self.x = x

    def get(self):
        return self.x

a_list = []
for index in range(3):
    obj = Example(index)

    def my_function(x):
        #some stuff with x like obj.another_function(x)
        return obj.get()

    a_list.append(my_function)

for c in a_list:
    print(c())
比里科

了解有关python如何工作的一些知识将有助于您了解这里发生的事情。obj是一个闭包,闭包是在调用时求值的,而不是在定义函数时求值的,所以如果我这样做:

x = "hello"
def printX():
    print x
x = "goodbye"
printX() # goodbye

我得到“再见”是因为printX在模块中引用了全局变量,该变量在创建后会更改printX

您要执行的操作是创建一个带有引用特定对象的闭包的函数。实现此功能的方法是创建一个返回另一个函数的函数:

x = "hello"
def makePrintX(a):
    def printX():
        # We print a, the object passed to `makePrintX`
        print a
    return printX

# x is evaluated here when it is still "hello"
myPrintX = makePrintX(x) 

x = "goodbye"
myPrintX() # "hello"

如果您在理解以上示例时遇到困难,建议您阅读python的作用域规则。对于您的示例,您可以执行以下操作:

class Example:
    def __init__(self, x):
        self.x = x

    def get(self):
        return self.x

def makeObjFunction(obj):
    def objFunction(x):
        return obj.get()
    return objFunction

a_list = []
for index in range(3):
    obj = Example(index)
    my_function = makeObjFunction(obj)

    a_list.append(my_function)

for c in a_list:
    print(c("some value"))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章