变量不适用于子功能

时间:2016-12-26 19:58:56

标签: python function variables

此脚本在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(继承的变量)。

5 个答案:

答案 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身体。此函数尝试查找名称:printgreeting(此过程称为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)

this post

在Python中,每个函数都有自己的作用域,因此您无法访问变量&#39; greetings&#39;在函数&#39; main&#39;之外,因为它已在此函数中定义。