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

时间:2017-07-14 12:20:01

标签: python scope

我正在阅读 Mike Dawson 绝对初学者的Python编程这本书,我对有关函数的问题感到震惊。

观察下面的代码

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

func_2()

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

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

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

func_2()

2 个答案:

答案 0 :(得分:4)

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

本地范围意味着它已锁定在该块的上下文中,并且块外的任何内容都无法看到它。在您的情况下,该块是一个函数。

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

在上面的示例中,该函数已在全局级别定义,因此其名称func_1具有全局范围(您可能还会说它位于&#34中;全局命名空间"。这意味着任何东西都可以看到它,包括其他函数内的代码。

相反,变量namefunc_1内有局部范围,这意味着它只在func_1内可见,而在其他任何地方都不可见。

当您return name时,您将 name的值传回给任何调用该函数的内容。这意味着user_input = func_1()接收返回的值并将其存储在名为user_input的新变量中。

实际变量name仍然只对func_1可见,但该值已通过return向外部函数公开。

编辑:根据@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'

完整性的一个额外修改:我在上面说明您已将name的值传回。这不是严格 true,因为Python是通过引用传递的,但是这里的水域变得模糊不清,我并不想混淆这个问题。有关观察者的更多详情:How do I pass a variable by reference?

答案 1 :(得分:0)

func_2调用func1,它返回一个可以在func_2中打印的值。在第一个示例中,func_2无法看到function_1的局部变量。