哪里出问题了

  python 中,使用 global 会将全局变量设为本函数可用。同时,在函数内部访问变量会先本地再全局

  在嵌套函数中,使用 global 会产生不合常理的行为。

  上代码:

In [96]: def x():
    b = 12
    def y():
        global a,b
        a = 1
        b = 2
    y()
    print "b =",b
   ....:     

In [97]: a = 111

In [98]: del b

In [99]: x()
b = 12

In [100]: a
Out[100]: 1

In [101]: b
Out[101]: 2

 

  而在函数 x() 中,没有用 global,此时的b使用本地。所以 print 会打印本地 b

  为什么会打印 12 ?还有 In[101]的 b 为 2 该怎么解释?

  

  y(),使用的 global 竟然没把 x() 的 b = 12 导进来。

  在函数 y() 中,语句  global a,b  使a,b扩展为全局,所以,在最高层,就算没有 b(In[98]),也会产生 b(In[101])。

  

  也就是说, global a,b ,会认为 a 和 b 是最外层的变量。

  再试一下:

   

In [102]: def x():
    b = 12
    def y():
        global a,b
        a = 1
    y()      
    print "b =",b
   .....:     

In [103]: a = 111

In [104]: del b

In [105]: x()
b = 12

In [106]: a
Out[106]: 1

In [107]: b
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-107-3b5d5c371295> in <module>()
----> 1 b

NameError: name 'b' is not defined

  

  报错了! y() global b 后没赋值,顶层就没有 b。这说明,global 只是引入名称,并不做赋值等操作。

  global 不会管变量存不存在,只导入名称,对该名称的操作会反应到 ‘最高层名称空间‘。

  再来:

  

In [109]: a = 111

In [110]: del b
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-110-745f2abe7045> in <module>()
----> 1 del b

NameError: name 'b' is not defined

In [111]: def x():
    b = 12
    def y():
        global a,b
        a = 1
        print b
    y()
    print "b =",b
   .....:     

In [112]: x()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-112-7354d77c61ac> in <module>()
----> 1 x()

<ipython-input-111-c05fc67a1e82> in x()
      5         a = 1
      6         print b
----> 7     y()
      8     print "b =",b
      9 

<ipython-input-111-c05fc67a1e82> in y()
      4         global a,b
      5         a = 1
----> 6         print b
      7     y()
      8     print "b =",b

NameError: global name 'b' is not defined

 

    这就确定了 内层y() 的 global 不会 导入 x() 的东西。

 

   那么,内层函数怎么使用正确的外层函数的变量呢?

 

解决内层函数参数传递问题

  

  一、

  首先,若只是取值,则不需要做任何处理。

 

In [119]: def x():
   .....:     a = 12
   .....:     def y():
   .....:         print a
   .....:     y()
   .....:     

In [120]: x()
12

In [121]: 

 

  在 y() 中,一旦为 a 赋值,a 立马变内部变量。

 

In [121]: def x():
   .....:     a = 12
   .....:     def y():
   .....:         print "before a =",a
   .....:         a = 1
   .....:         print "then a =",a
   .....:     y()
   .....:     

In [122]: x()
before a =---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-122-7354d77c61ac> in <module>()
----> 1 x()

<ipython-input-121-d8fbc0dba399> in x()
      5         a = 1
      6         print "then a =",a
----> 7     y()
      8 

<ipython-input-121-d8fbc0dba399> in y()
      2     a = 12
      3     def y():
----> 4         print "before a =",a
      5         a = 1
      6         print "then a =",a

UnboundLocalError: local variable 'a' referenced before assignment

 

  一旦在函数 y() 的某处给 a 赋值,则在赋值前,python 会认为 a 不存在。

  同时发现 python2 的 print 会一个一个的 输出。鉴于此,我又在 python3 中试了,发现他是 一起输出。但这不是本文重点,折叠之。

 

In [7]: def x():
    a = 1
    def y():
        print("before a=",a)
        a = 10
        print("then a=",a)
    y()
   ...:     

In [8]: x()
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-8-7354d77c61ac> in <module>()
----> 1 x()

<ipython-input-7-6e01e7317b24> in x()
      5         a = 10
      6         print("then a=",a)
----> 7     y()
      8 

<ipython-input-7-6e01e7317b24> in y()
      2     a = 1
      3     def y():
----> 4         print("before a=",a)
      5         a = 10
      6         print("then a=",a)

UnboundLocalError: local variable 'a' referenced before assignment
View Code

相关文章:

  • 2022-12-23
  • 2021-12-29
  • 2022-02-16
  • 2022-03-05
  • 2022-02-28
  • 2022-12-23
  • 2022-12-23
  • 2021-09-10
猜你喜欢
  • 2021-09-12
  • 2021-08-13
  • 2022-12-23
  • 2021-07-24
  • 2021-08-17
  • 2021-06-07
  • 2021-10-02
相关资源
相似解决方案