【问题标题】:Why does Python let you instantiate local variables as global from inside a function?为什么 Python 允许您从函数内部将局部变量实例化为全局变量?
【发布时间】:2013-01-03 19:50:00
【问题描述】:

为什么在没有先在全局范围内声明 a 的情况下,以下代码在 Python 中有效?

def setA():
   global a 
   a = 5

def printA():
    print a

setA()
printA()

在我看来,这是正确的做法:

a = None

def setA():
   global a 
   a = 5

def printA():
    print a

setA()
printA()

【问题讨论】:

  • 有什么选择?如果a 在全局范围内不存在,global 是否应该静默失败并让它在本地?它应该引发异常吗?
  • 我的印象是 global 关键字的意思是“以下指的是全局范围内的变量”。我认为当您执行“打印”时,应该会出现变量未知的错误。
  • @Stewart:这并不意味着,它意味着“以下名称的任何使用现在都被认为是在全局范围内运行”。该名称是否已存在于那里并不重要。如果您分配给它但它不存在,它会创建它,就像您在模块顶层实际分配给它一样。
  • @BrenBarn 好的,这是有道理的。像我的第二段代码而不是第一种方式那样做会更好吗?
  • @Stewart:按照这些思路做一些事情可能是有意义的,尽管None 可能不是最佳选择。通常你只会将全局变量用于某种全局配置选项,所以你会设置一个初始的、有用的默认值,然后可能会在以后更改它。但是,是的,为了使代码更具可读性,最好尽早定义全局。

标签: python scope global-variables


【解决方案1】:

基本上与a = 5 用于创建新的局部变量的原因相同:当您分配一个变量时,Python 并不关心它是否已经存在。 global 语句仅表示“在此范围内对以下名称的任何使用现在都被视为在全局范围内运行”。

无论a 是否存在,您都可以在模块顶层执行a = 5。所以你可以在一个函数中做global a; a = 5global 使函数内部的赋值就像全局级别的赋值一样工作,包括名称是否已经存在都无关紧要这一事实。

【讨论】:

  • +1。当然可以在 Python 3 中用nonlocal 试试这个……(这里的区别是global a; a = 5 不可能有歧义——它有一个明显的含义,这就是编译器使用的含义。)
  • 请注意,我们可以在不使用任何global 语句的情况下修改可变全局对象。
猜你喜欢
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 2019-07-24
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
相关资源
最近更新 更多