【问题标题】:Using global variables in python in a function在函数中使用python中的全局变量
【发布时间】:2016-03-23 06:11:23
【问题描述】:
def foo():
    global a 
    a = 10

a = 0
def foo():
    a = 10

在函数中声明全局而不是在顶部声明变量有什么用。这样应该更干净吧?

【问题讨论】:

  • 你试过第二种情况吗?运行foo之后是什么?
  • 所以这两种情况的区别在于,在第一种情况下,您更改了函数内部的全局变量。在第二种情况下,你不知道,a 在函数内部只是一个局部变量,所以有混淆的空间。

标签: python function namespaces


【解决方案1】:

问。在函数中声明全局而不是在顶部声明变量有什么用?

通常我们将一些经常使用的常量定义为全局变量。

>>> import math
>>> math.pi
3.141592653589793

数学内容/网页/服务器名称/URL - 在一段时间内不会改变。

一般来说,不建议重新定义全局变量或在函数中定义全局变量。但是很少有例外情况,我们别无选择,只能重新定义它。可能是由于旧系统的新升级,该变量在整个系统中被大量使用。

所以请采用第二种方法。在您的外部定义“a” 功能。这看起来也不错且易于阅读。

>>> a = 10
>>> def foo():
...     a = 14 # defining a local variable called a
...
>>> a
10
>>>
>>> foo()
>>> a  
10
>>> # a = 14 has no scope outside foo function
>>> 
>>> def foo():
...     global a # notify function to use global variable here.
...     a = 15 # re-defining global ==> nt preferred it
...
>>> a
10
>>> foo()
>>> a # see now it changed here.
15

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    在第一种情况下,所有函数的值都保持不变。

    def set_globvar_to_one():
        global globvar
        globvar = 1
        print globvar
    
    def print_globvar():
        print globvar     # No need for global declaration to read value of globvar
    
    set_globvar_to_one()
    print_globvar()
    

    输出将是 1 和 1。

    但是第二种情况

    def set_globvar_to_one():
        globvar = 1
        print globvar
    
    def print_globvar():
        print globvar     # No need for global declaration to read value of globvar
    
    set_globvar_to_one()
    print_globvar()
    

    这里你得到errorglobvar is not defiend,因为没有名为 globavar 的局部或全局变量

    【讨论】:

      【解决方案3】:

      这会使它变得模棱两可。看看这个,

      a = 0
      def foo():
          a = 10 # *
      

      查看标记为* 的行。您是分配给全局a,还是这是一个局部变量a,其值为10。口译员无法知道您的意思。因此,需要global

      a = 0
      def foo():
          a = 10 # local variable a
      
      def bar():
          global a # will be modifying global variable a in this function
          a = 10 # assign 10 to global variable 
      

      【讨论】:

        【解决方案4】:

        在您的第一个示例中,在调用 foo() 之前“a”不可用。一旦它在函数中定义,它就可以在函数之外使用。

        在第二个示例中,它在调用 foo() 之前可用,但在函数内部对其进行的更改不会影响全局版本。

        这个例子应该说明两个例子之间的区别

        #!/usr/bin/python
        
        def foo():
            global a
            a = 10
            print a
        
        try:
         print a
        except Exception,e:
         print e
        
        foo()
        print a
        
        print "-"*70
        
        b = 0
        def bar():
            b = 10
            print b
        
        print b
        bar()
        print b
        

        输出:

        global name 'a' is not defined
        10
        10
        ----------------------------------------------------------------------
        0
        10
        0
        

        【讨论】:

          【解决方案5】:

          如果您将其声明为全局,则不必返回它。 如果你不使用全局,你有返回 a 的函数。 如果没有全局,它是这样的:

          In [7]: def foo():
             ...:     a = 10
             ...:     return a
             ...: 
          
          In [9]: a = foo()
          
          In [10]: a
          Out[10]: 10
          

          与全局:

          In [11]: a = 0
          
          In [12]: def foo2():
             ....:     global a
             ....:     a = 10
             ....:     
          
          In [13]: a
          Out[13]: 0
          
          In [14]: foo2()
          
          In [15]: a
          Out[15]: 10
          

          是你决定你的函数是返回还是使用全局。 它可以简化你的代码,它对于计算一些你不想每次都调用它的常量的函数很有用。 但如果用于单个程序,则更喜欢“返回”方法。

          【讨论】:

          • 这不能回答所提出的问题 - What is the use of declaring global in a function instead of declaring variables right at the top.
          • 这是一个答案。您可以决定是否希望函数返回参数(并使用 global 代替)
          【解决方案6】:

          如果你在循环中使用相同的变量,那么全局变量和局部变量之间就会存在竞争。所以如果你想在循环中使用全局变量的值,你必须提到'global'关键字

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-16
            相关资源
            最近更新 更多