此脚本在main()
内定义变量,但变量不可用于func()
,main()
在#!/usr/bin/env python3
# vars_in_func.py
# Test script for variables within a function.
def func():
print(greeting)
def main():
greeting = "Hello world"
func()
main()
内运行。那是为什么?
Traceback (most recent call last):
File "./vars_in_func.py", line 11, in <module>
main()
File "./vars_in_func.py", line 9, in main
func()
File "./vars_in_func.py", line 5, in func
print(greeting)
NameError: name 'greeting' is not defined
错误:
global name
如果我将脚本转换为Python2,则错误是相同的,除了它显示name
而不是{{1}}。
我认为我只是错过了一个关键概念。我刚刚学习了Bash后开始学习Python。
编辑:在阅读完答案后,我意识到自己的错误:我仍然在思考Bash,其中函数与调用者在同一个shell中运行(具有相同的变量) ),或调用者的子shell(继承的变量)。
答案 0 :(得分:3)
greeting = None
def func():
print(greeting)
def main():
global greeting
greeting = "Hello world"
func()
main()
在您的解决方案中,main函数中定义的问候语是局部变量,无法在main函数外部访问。这就是它给你错误的原因
答案 1 :(得分:2)
我对python知之甚少,但一般来说全局变量需要在main范围之外定义,但是在你想要使用它们的函数之前。如果你不想创建一个全局变量,你需要将变量作为参数传递给函数。
答案 2 :(得分:1)
关于python范围规则有很多答案,这里真的很重要。但是当我看到你的问题时,你的误解在于完全不同的东西:定义函数和调用它之间的巨大差异。
LEGB规则很重要,但这里真正重要的是: “范围是静态确定的,它们会动态查找!” 。粗略地说,函数知道在哪里查找变量(编译时),但它不知道变量值(在调用函数之前)。
在你的情况下,你只需将一个函数调用到另一个函数的主体中。当你调用函数时,调用者将控制传递给被调用者(粗略地,将其想象为源代码中的跳转到函数的代码块的开头)。所以当你致电func
时,你会跳进func
身体。此函数尝试查找名称:print
和greeting
(此过程称为Name resolution
)它在local
范围内查找,然后在global
范围内查看(范围)在哪里定义,未调用),最后在builtins
。它只在print
中找到builtins
。因为它没有找到greeting
名称,所以在NameError
调用{{1}的地方引发异常main
(在检测到错误的位置引发异常) }}。当根本不处理异常时,解释器终止程序的执行,或返回其交互式主循环。在任何一种情况下,它都会打印堆栈回溯,除非异常为func
。
希望它能为你澄清一些观点。
还有一个查找信息的地方:The Python Language Reference: Execution model
p.s。:SystemExit
始终是global scope
(带代码的文件),其中定义了函数。理解!!!非常重要。
答案 3 :(得分:0)
在python中,函数不能访问函数外的任何变量,除非它是参数或声明为global
。
这应该有望解决问题:
greeting = None
def func():
print(greeting)
def main():
global greeting # Declaring as global means func() can access it
greeting = "Hello world"
func()
main()
答案 4 :(得分:0)
在Python中,每个函数都有自己的作用域,因此您无法访问变量&#39; greetings&#39;在函数&#39; main&#39;之外,因为它已在此函数中定义。