我读这本书的绝对新手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)
这里要考虑的重要事项是您正在使用的变量和/或函数名称的范围。全局作用域意味着所有人都可以看到它,无论它是在顶层,在函数内部还是在方法内部(在类内部)。
局部作用域意味着它被锁定在该块的上下文中,并且该块之外的任何人都看不到它。在您的情况下,该块是一个函数。
(请注意,这只是一个简单的简化,并且模块和包含模块周围存在更复杂的规则,但这对于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是通过引用传递的,但是这里的水变得模糊了,我不想混淆这个问题。感兴趣的观察者可以在这里找到更多详细信息:如何通过引用传递变量?