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)

in ()

----> 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)

in ()

----> 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)

in ()

----> 1 x()

in x()

5 a = 1

6 print b

----> 7 y()

8 print "b =",b

9

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)

in ()

----> 1 x()

in x()

5 a = 1

6 print "then a =",a

----> 7 y()

8

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)

in ()

----> 1 x()

in x()

a = 10

print("then a=",a)

----> 7 y()

in y()

a = 1

def y():

----> 4 print("before a=",a)

a = 10

print("then a=",a)

UnboundLocalError: local variable 'a' referenced before assignment

同时发现 python代码运行前 会先扫一遍代码的,而不是单纯的一行一行的执行。

同时发现返回 UnboundLocalError,而不是 NameError。注意到 'unbound‘,这是官方概念。用 'unbound‘ 来描述就是:global 会将顶层变量名称 绑定 到本地变量名称,同时变化,是为 '引用‘;python 检测到 a = 1时,意识到 a 是本地的,所以 在 a '指向一个对象‘(因为python变量均为引用),之前 ,调用 a 是非法 行为,但这种行为区别于于 NameError,就定义为 unbound local。

二、

使用 可变变量,如 list,dict

In [127]: def x():

.....: l = ["in msg"]

.....: def y():

.....: msg = l[0]

.....: print "msg =",msg

.....: l[:] = ["out msg"]

.....: y()

.....: print l[0]

.....:

In [128]: x()

msg = in msg

out msg

没有报错,完美!

要注意 语句 l[:] = ["out msg"] ,使用切片赋值,否则,

In [129]: def x():

l = ["in msg"]

def y():

msg = l[0]

print "msg =",msg

l = ["out msg"]

y()

print l[0]

.....:

In [130]: x()

---------------------------------------------------------------------------

UnboundLocalError Traceback (most recent call last)

in ()

----> 1 x()

in x()

5 print "msg =",msg

6 l = ["out msg"]

----> 7 y()

8 print l[0]

9

in y()

2 l = ["in msg"]

3 def y():

----> 4 msg = l[0]

5 print "msg =",msg

6 l = ["out msg"]

UnboundLocalError: local variable 'l' referenced before assignment

又出 UnboundLocalError 了,因为 第六行代码 为 l 分配了 一个新的 list。

三、

利用参数传递。

In [136]: def x():

.....: a, b = 1, 2

.....: def y(a = a, b = b):

.....: a, b = 3, 4

.....: return a, b

.....: a, b = y()

.....: print a, b

.....:

In [137]: x()

3 4

注意,不要在默认参数上放 list等可变对象。

以上所述是小编给大家介绍的PYTHON 中使用 GLOBAL引发的一系列问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

python中global的使用_PYTHON中使用GLOBAL引发的一系列问题相关推荐

  1. [转载] python不允许使用关键字_Python中关键字global与nonlocal的区别

    参考链接: Python全局关键字 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xCyansun/article/details/79672634 ...

  2. python中global的意思_python中global是什么意思?

    上篇小编介绍了python中locals函数的作用(https://www.py.cn/jishu/jichu/22264.html),它可以更新并以字典形式返回当前全部局部变量,python中另一个 ...

  3. python中赋值语句的作用_python中return可以使用赋值语句吗?

    在python中,有各种不同类型的语句.一个python程序是由模块构成的;一个模块由一条或多条语句组成;每个语句由不同的表达式组成;表达式可以创建和操作对象.下面来看看python中的语句. 赋值语 ...

  4. python 局部变量 占内存吗_Python中全局变量和局部变量的理解与区别

    前言 学过编程的人应该对全局变量与局部变量这两个名词并不陌生,Python也同多数编程语言一样,也有全局变量与局部变量的概念 但是与其他编程语言又有所不同 全局变量与局部变量两者的本质区别就是在于作用 ...

  5. python函数中变量的作用域_Python中变量的作用域(variable scope)

    此文目的 此文主要讨论和总结一下,Python中的变量的作用域(variable scope). 目的在于,通过代码,图解,文字描述,使得更加透彻的了解,Python中的变量的作用域: 以避免,在写代 ...

  6. python find的使用方法_Python中的rfind()方法使用详解

    Python中的rfind()方法使用详解 rfind()方法返回所在子str 被找到的最后一个索引,或者-1,如果没有这样的索引不存在,可选择限制搜索字符串string[beg:end]. 语法 以 ...

  7. python中函数的作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

  8. python列表怎么写文件_python中以字典为元素的列表怎么写入文本文件

    python如何将列表中的元素添加进字典纵然被命运的铁蹄狠狠践踏,也顽强地长出自己的根芽. 录入自己和另一个人的名字的汉语拼音简写,然后依据标识符中字母的数值两个人,一颗心,依偎的不是爱情而是那小温暖 ...

  9. python中round函数参数_python中关于round函数的小坑

    round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10.0/3, 2) 3.33 >>> round(20/7) 3 第一个参数是 ...

最新文章

  1. 视频插值--Video Frame Interpolation via Adaptive Separable Convolution
  2. 人月神话阅读笔记03
  3. MySQL 错误对照表
  4. Hibernate占位符问题[use named parameters or JPA-style positional parameters instead.]
  5. just have a view of the open source project i contributed!!!
  6. 【学生选课系统经典】C#与SQLSERVER连接:Windows应用工程案例
  7. java 重写session_关于session的实现:cookie与url重写
  8. hadoop示例源码位置
  9. [詹兴致矩阵论习题参考解答]习题1.10
  10. MergeSort(合并排序)
  11. “此电话号码无法用于进行验证” 注册gmail邮箱手机号码不能验证的解决方法(已解决)
  12. 杠杆的倍数一般是多少?
  13. MySQL语句查询数据库数据并添加到Redis缓存
  14. 计算机二级投影运算怎么看,投影运算
  15. 产品原则和产品评审团
  16. 苏嵌学习日志03 07.13
  17. 论这两年不断突破心理底线的互联网薪水by OfferCome从猎头角度推测,搜狗的买卖对于互联网格局和薪水的影响烧钱薪水反思
  18. 博图V15仿真时出现“实际在线CPU当前连有一些应用程序。只有关闭它们后才可启动仿真器”的问题,不弹出仿真窗口
  19. 基于labview的控件句柄_关于labview同步中的引用句柄
  20. WD移动硬盘拆机,没有SATA接口,无法当笔记本电脑硬盘使用

热门文章

  1. 程序员如何 10 分钟用 Python 画出蒙娜丽莎?
  2. LeetCode 题 - 69. x 的平方根 python解法
  3. 本地Spark连接远程集群Hive(Scala/Python)
  4. Spring(1)-IOC
  5. django项目的邮件发送及redis数据库应用
  6. JS+CSS全力打造的一级横向滑动,二级竖向下拉综合菜单
  7. 漫步数学分析九——级数
  8. 浏览器内核与web标准
  9. 数字图像处理--图像的缩放变换
  10. MySQL之EXPLAIN(索引优化)