我正在阅读 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()
答案 0 :(得分:4)
这里要考虑的重要事项是您正在使用的变量和/或函数名称的范围。 全局范围意味着一切都可以看到它,无论是在顶层,在函数内部,还是在一个类中的方法内部。
本地范围意味着它已锁定在该块的上下文中,并且块外的任何内容都无法看到它。在您的情况下,该块是一个函数。
(请注意,这是一个温和的简化,并且模块周围存在更复杂的规则并且包含,但这对于10 ...来说这是一个合理的启动。)。
在上面的示例中,该函数已在全局级别定义,因此其名称func_1
具有全局范围(您可能还会说它位于&#34中;全局命名空间"。这意味着任何东西都可以看到它,包括其他函数内的代码。
相反,变量name
在func_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的局部变量。