鱼C论坛

 找回密码
 立即注册
查看: 1438|回复: 7

[技术交流] Python global

[复制链接]
发表于 2020-3-27 10:06:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wuqramy 于 2020-3-27 10:55 编辑

Python global

语法:

  1. global varname
复制代码


描述:

Python中定义函数时,若想在函数内部对函数外的变量进行操作,就需要在函数内部声明其为global。

实例:

  1. >>> x = 1
  2. >>> def fun1():
  3.         x = 2

  4.        
  5. >>> fun1()
  6. >>> print(x)
  7. 1
  8. >>> # 解析:在fun1函数中并未在x前面加global,所以fun1函数无法将x赋为2,无法改变x的值
  9. >>> x = 1
  10. >>> def fun1():
  11.         global x
  12.         x = 2

  13.        
  14. >>> fun1()
  15. >>> print(x)
  16. 2
  17. >>> # 解析:global需要在函数内部声明,若在函数外声明,则函数依然无法操作x
复制代码



点评

我很赞同!: 3.0
我很赞同!: 3
建议添加个 “描述”  发表于 2020-3-27 10:34

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-27 11:32:37 | 显示全部楼层
       应该明确,"操作"是特指赋值,因为,在函数内部,在未使用 global 关键字对全局变量进行声明的情况下,是可以访问全局变量的,唯一的限制是全局变量不能出现在赋值语句的左边,也就是说,不能被赋值,如果赋值了,那就会新产生一个与全局变量同名的局部变量。而加上 global 关键字的声明之后,就没有这个限制了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 10:09:09 | 显示全部楼层
你知道这段代码为什么会报错吗

  1. import random

  2. def func(ok):
  3.     if ok:
  4.         return random.randint(1, 10)
  5.     else:
  6.         import random
  7.         return random.random()

  8. func(True)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 10:11:35 | 显示全部楼层
一个账号 发表于 2020-3-27 10:09
你知道这段代码为什么会报错吗:

要在函数内部导入?
  1. Traceback (most recent call last):
  2.   File "C:\Pythonstudy\test.py", line 10, in <module>
  3.     func(True)
  4.   File "C:\Pythonstudy\test.py", line 5, in func
  5.     return random.randint(1, 10)
  6. UnboundLocalError: local variable 'random' referenced before assignment
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 10:13:45 | 显示全部楼层
wuqramy 发表于 2020-3-27 10:11
要在函数内部导入?

import random 相当于在 func 里边定义了 random 这个变量,

根据 bleg 的顺序,覆盖了全局的 random。

但是进入第一个分支的时候 random 这个名字还没有被绑到模块上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 10:35:39 | 显示全部楼层
wuqramy 发表于 2020-3-27 10:11
要在函数内部导入?

改成这样就木有问题了:

  1. import random

  2. def func(ok):
  3.     global random
  4.     if ok:
  5.         return random.randint(1, 10)
  6.     else:
  7.         import random
  8.         return random.random()

  9. func(True)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 10:52:04 | 显示全部楼层
一个账号 发表于 2020-3-27 10:35
改成这样就木有问题了:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 15:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表