闭包函数中的参数绑定

时间:2018-08-22 10:30:39

标签: python function arguments closures

def test():
    x = 99
    def nested(x):
        print (x)
    return nested

a = test()
a()

TypeError:nested()缺少1个必需的位置参数:'x'

当我调用nested打印在闭包函数test中分配的参数x时,TypeError提示我将位置参数传递给嵌套,但是为什么没有在测试函数中分配的'x'被传递传递到嵌套?

2 个答案:

答案 0 :(得分:5)

space

函数名称空间是自动继承的,您不必将其作为参数传递。如果在函数定义中包含参数,则在调用函数时必须强制将其传递一个值(除非您设置默认值,例如:)

def test():
    x = 99
    def nested():
        print (x)
    return nested

a = test()
a()

对于您提供的代码,我了解您有点儿了解嵌套函数的功能,但是您无法掌握名称空间的概念。要从名称空间,范围和函数/方法参数中得知,建议您阅读以下内容:

  

作用域是指程序中可以使用名称空间的区域。   直接访问,即不使用名称空间前缀。其他   单词:名称的范围是该名称所在的程序区域   可以明确地使用,例如在函数内部。名字的   名称空间与其作用域相同。范围是静态定义的,   但它们是动态使用的。

https://www.python-course.eu/namespaces.php

您可能会发现此其他链接很有用: https://www.quora.com/What-is-the-difference-between-parameters-and-arguments-in-Python不过,最好始终阅读Python文档,以获取准确而完整的理解;)

答案 1 :(得分:0)

执行a = test()时,您已经调用了test()函数,并获得了nested函数。该函数需要一个参数,因此您不能单独通过a()来调用它(就像通过nested()来调用它一样)。您需要将其修改为def nested()才能使代码正常工作,更重要的是,要看到该函数“记住”外部定义的x

一个更典型的例子是

def test(x):
    def nested(y):
    print(f'x is {x}, y is {y}')
return nested

a = test(5)
a(12)