重要的是要考虑您正在使用的变量和/或函数名称的范围。全局范围意味着所有内容都可以看到它,无论是在顶层、函数内部还是甚至是类内部的方法中。
本地范围意味着它被锁定在该块的上下文中,块外部的任何内容都无法看到它。在您的情况下,该块是一个函数。
(请注意,这是一个轻微的简化,关于模块和包含存在更复杂的规则,但这是一个合理的起点...)。
在您上面的示例中,函数已在全局级别定义,因此它的名称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()
name_is_global = 'name' in globals()
为了完整起见,还要进行一次编辑: 我之前说过你会传回name
的值,这不是严格意义上的,因为Python是按引用传递的,但这里情况比较复杂,我不想让问题变得混乱。有兴趣的读者可以在此处了解更多细节:如何按引用传递变量?
return name
。 - Rahulfunc_1
可以在func_2
内部调用,但name
不能在func_2
内部调用。这是暂时不考虑return
的责任。 - idjaw