def test():
x = 99
def nested(x):
print (x)
return nested
a = test()
a()
TypeError:nested()缺少1个必需的位置参数:'x'
当我调用nested
打印在闭包函数test
中分配的参数x时,TypeError提示我将位置参数传递给嵌套,但是为什么没有在测试函数中分配的'x'被传递传递到嵌套?
答案 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)