【问题标题】:Correct Use Of Global Variables In Python 3在 Python 3 中正确使用全局变量
【发布时间】:2012-03-11 02:14:49
【问题描述】:

Python 3 中全局变量的正确用法是什么?:

1) 在核心脚本中(不在函数内)声明一次global VAR_NAME,然后在其他任何地方简单地将变量称为VAR_NAME

2) 在每个使用全局变量的函数中声明一次global VAR_NAME,然后在函数的其余部分和核心脚本本身中简单地将变量称为VAR_NAME

【问题讨论】:

  • 第二个 Rik 的观点,一个更重要的问题是什么让你认为你需要它?在初学者中使用 global 关键字几乎总是表明尝试使用其他语言的思维方式进行编程,如果您正在阅读一些鼓励它的教程,您需要获得更好的。
  • 只有 #2 是相关的。您不能全局声明全局。您必须在每个要引用全局的本地命名空间中更改名称的含义。当您尝试方法#1时,它甚至有效吗?如果是这样,你能举个例子来证明吗?和。避免使用全局变量。
  • 除了其他人所说的不使用 global 之外,您可以通过尝试两者轻松找出哪个有效。

标签: python function variables python-3.x global-variables


【解决方案1】:

在第一种情况下,全局关键字是没有意义的,所以这是不正确的。在模块级别定义变量使其成为全局变量,您不需要 global 关键字。

第二个例子是正确的用法。

但是,全局变量最常见的用法是在任何地方都不使用 global 关键字。仅当您想重新分配函数/方法中的全局变量时,才需要 global 关键字。

【讨论】:

  • 谢谢,这帮助我弄清楚如何将模块用作单例而不是为它创建一个类。我没有意识到我不应该在函数内部重新分配模块级变量。
  • 我没有反对,但我发现这个答案有一个问题:OP 的 #2 示例实际上是不正确的:函数中不需要全局关键字,除非函数正在分配 [新]全局变量的值。如果函数只引用(读取)全局变量,则不需要 global 关键字。
【解决方案2】:

上述答案中前两种情况和后两种情况的主要区别在于列表是可变的。对于像 a = 1 这样的情况,指针指向 1 所在的位置,当您说 a = 2 时,指针会移动。

对于可变对象的情况,分配了一个内存位置,当使用 append 之类的方法时,内存位置本身会发生变化,因此可变引用的值会全局更改。

现在最大的问题是函数如何知道我们正在修改的变量是全局变量还是局部变量,因为如果全局变量是可变的,我们似乎可以修改它,如果它不可变,我们就不能修改(该函数也可以不承认这是全局变量)

【讨论】:

    【解决方案3】:

    “以其他方式被解释为对局部变量的赋值”——是的,但这里有一个微妙的细节:

    --------------------错误:赋值前引用了局部变量'c'

    def work():
      c += 3
    
    c = 0
    
    work()
    print(c)
    

    --------------------错误:赋值前引用了局部变量'c'

    c = 0
    
    def work():
      c += 3
    
    work()
    print(c)
    

    ----------------- 打印 [3]

    def work():
      c.append(3)
    
    c = []
    
    work()
    print(c)
    

    ----------------- 打印 [3]

    c = []
    
    def work():
      c.append(3)
    
    work()
    print(c)
    

    【讨论】:

      【解决方案4】:

      如果您使用全局变量的方式会被解释为对局部变量的赋值,则您需要在函数中使用 global 关键字。如果没有 global 关键字,您将创建一个将全局隐藏在函数范围内的局部变量。

      这里有几个例子:

      global_var = 1
      
      def example1():
          # global keyword is not needed, local_var will be set to 1.
          local_var = global_var
      
      def example2():
          # global keyword is needed, if you want to set global_var,
          # otherwise you will create a local variable.
          global_var = 2
      
      def example3():
          # Without using the global keyword, this is an error.
          # It's an attempt to reference a local variable that has not been declared.
          global_var += 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 2017-08-02
        • 2013-04-18
        相关资源
        最近更新 更多