对不起,标题,希望它能正确反映我的问题:
在以下代码中,我期望结果为结果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] 删除。
我来说两句