我试图了解以下原因的背景:
def part_string(items):
if len(items) == 1:
item = items[0]
def g(obj):
return obj[item]
else:
def g(obj):
return tuple(obj[item] for item in items)
return g
my_indexes = (2,1)
my_string = 'ABCDEFG'
function_instance = part_string(my_indexes)
print(function_instance(my_string))
# also works: print(part_string(my_indexes)(my_string))
为什么我可以将 my_string 传递给 function_instance 对象,即使我已经将 my_indexes 属性传递给 part_string()创建 function_instance 时?为什么Python隐式接受 my_string ?
我想这与以下内容有关,所以这里有更多问题: g(obj)中的 obj 是什么?这可能是其他的东西,例如 g(东西)(与 self 一样,只是一种惯例)? 如果我想将2个对象传递给 function_instance 怎么办?我如何在 g(obj)中引用它们?
你能推荐一些阅读吗?
答案 0 :(得分:0)
您遇到的是closure。
当你写part_string(my_indexes)
时,你正在创建一个新函数,并且在调用它时,你使用你给part_string
的旧变量和给function_instance
的新变量。
您可以根据需要命名内部函数,并且没有约定。 (obj
在此处使用,但它可以是pie
。除了func
除了函数闭包(decorators)之外,没有任何约定。
如果您希望将两个变量传递给函数,您可以为g(obj)
函数定义两个变量:
def g(var1, var2):
...
以下是有关closures in python的更多信息。