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

3

我正在阅读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
你到底对什么感到困惑?是函数的调用,还是将值“返回”给调用者? - deceze
尝试移除 return name - Rahul
我认为混淆在于理解作用域,以及为什么func_1可以在func_2内部调用,但name不能在func_2内部调用。这是暂时不考虑return的责任。 - idjaw
我不确定这是否与您的问题有关,但是这里的内容是否和您的问题有关?您可以澄清一下,到底是什么让您感到困惑? - Christian Dean
4
为什么会有这么多踩?这似乎是一个清晰的问题,对于初学者来说,这种误解也是合理的。 - Chris_Rands
显示剩余6条评论
2个回答

5
重要的是要考虑您正在使用的变量和/或函数名称的范围。全局范围意味着所有内容都可以看到它,无论是在顶层、函数内部还是甚至是类内部的方法中。
本地范围意味着它被锁定在该块的上下文中,块外部的任何内容都无法看到它。在您的情况下,该块是一个函数。
(请注意,这是一个轻微的简化,关于模块和包含存在更复杂的规则,但这是一个合理的起点...)。
在您上面的示例中,函数已在全局级别定义,因此它的名称func_1具有全局作用域(您还可以说它在“全局命名空间”中)。这意味着任何东西都可以看到它,包括其他函数内部的代码。
相反,变量name具有局部作用域,在func_1内部,这意味着它仅在func_1内部可见,而不在其他任何地方可见。
当您返回name时,您将name的值返回给调用该函数的任何内容。这意味着user_input = func_1()接收返回的值并将其存储在一个新变量中,称为user_input。
实际变量name仍然只对func_1可见,但该值已通过返回值公开给外部函数。
编辑:按照@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的值,这不是严格意义上的,因为Python是按引用传递的,但这里情况比较复杂,我不想让问题变得混乱。有兴趣的读者可以在此处了解更多细节:如何按引用传递变量?


最好也提一下func_1确实是被限定在只能被func_2调用的作用域内,以及为什么。简单介绍一下全局/局部作用域会对此有所帮助。 - idjaw
1
你真是能够读懂我的想法,我正好在相应地更新。我还会多加一点关于本地和全局的内容。 - n00dle
2
我认为澄清一下你返回的是name的值而不是变量name本身也是很好的。原帖作者似乎很困惑,因为他认为在从func_1返回后,name会以某种方式在func_2中变得可访问。 - Christian Dean
@ChristianDean 我已按要求更改措辞。 - n00dle

0

func_2 调用 func1,它会返回一个值,你可以在 func_2 中打印该值。在你的第一个例子中,func_2 看不到函数 func_1 的局部变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接