Python在另一个函数中调用一个函数

Dav*_*ith 3 python scope

我读这本书的绝对新手Python编程迈克·道森,我被一个问题,我有关于功能来袭。

观察下面的代码

def func_1():
    name = input('What is your name?')
def func_2():
    print(name)

func_2()
Run Code Online (Sandbox Code Playgroud)

我知道我无法name在函数2中调用变量,因为它是函数1的局部变量。

但是,为什么我可以在另一个函数中调用一个函数,然后按如下所示找到用户输入的值?

def func_1():
    name = input('What is your name?')
    return name
def func_2():
    user_input = func_1()
    print(user_input)

func_2()
Run Code Online (Sandbox Code Playgroud)

n00*_*dle 5

这里要考虑的重要事项是您正在使用的变量和/或函数名称的范围全局作用域意味着所有人都可以看到它,无论它是在顶层,在函数内部还是在方法内部(在类内部)。

局部作用域意味着它被锁定在该块的上下文中,并且该块之外的任何人都看不到它。在您的情况下,该块是一个函数。

(请注意,这只是一个简单的简化,并且模块和包含模块周围存在更复杂的规则,但这对于10 ...是一个合理的起点。)

在上面的示例中,该函数已在全局级别定义,因此其名称func_1具有全局范围(您可能还说它在“全局名称空间”中。这意味着任何人都可以看到它,包括其他函数中的代码) 。

相反,该变量name具有local scope,inside func_1,这意味着它仅在inside内可见func_1,而在其他地方则不可见。

当您使用时return name,您将把back 的值 传递name回该函数。这意味着user_input = func_1()接收到返回的值,并将其存储在名为的新变量中user_input

实际变量name仍仅对可见func_1,但该值已通过returning 暴露给外部函数。

编辑:按@Chris_Rands的要求:

Python中有一个函数,它将为您提供一个字典,其中包含程序中当前可用的所有全局变量。

这就是globals()功能。您可以通过查看字典中的内容来检查它们是否在全局范围内:

def func_1():
    name = input('What is your name?')
def func_2():
    print(name)

func_1_is_global = 'func_1' in globals()  # value is 'True'
name_is_global = 'name' in globals()      # value is 'False'
Run Code Online (Sandbox Code Playgroud)

为完整性起见,还有一项编辑:我在上面声明,您正在传递nameback 的值。严格来说,这不是正确的,因为Python是通过引用传递的,但是这里的水变得模糊了,我不想混淆这个问题。感兴趣的观察者可以在这里找到更多详细信息:如何通过引用传递变量?

  • 我认为澄清一下您将返回“名称”的_value_而不是变量“名称”本身也将是一件好事。OP似乎很困惑,因为他认为从`func_1`返回它后,`name`在某种程度上可以在`func_2`中访问。 (2认同)