无参数输入的可变功能范围

ele*_*lar 2 python scope function python-3.x

我试图理解Python(3.x)中的变量范围,但下面是一个不起作用的代码示例,我不知道为什么.

def function_a(A):
    function_b()

def function_b():
    print(A)

function_a(1)
Run Code Online (Sandbox Code Playgroud)

结果如何 NameError: name 'A' is not defined

所以,我认为它的工作方式是,function_a()function_b()被definid.然后我运行function_a()在哪里A被赋值为1.

所以在function_a()变量A = 1 的范围内存在.

然后function_b()被调用,意味着打印变量的值A.在function_b()的范围内不存在A. 因此,我希望它看起来更高,这将是function_a()因为function_b()在其中运行的范围function_a().

但显然,我错了.究竟发生了什么?

hsp*_*her 6

仅仅因为你在function_b里面打电话function_a并不意味着它会继承范围function_a和有充分理由.该函数从定义的位置获取范围,而不是从其调用的位置.

如果你想完成像closures你应该尝试定义function_b内部的东西function_a.

def function_a(A):
     def function_b():
         print(A)
Run Code Online (Sandbox Code Playgroud)

话虽如此,我在这里看不到封闭的用例.你最好把变量作为参数传递.这样,它将更具可重用性和可测试性.

def function_a(A):
    function_b(A)

def function_b(A):
    print(A)
Run Code Online (Sandbox Code Playgroud)