鱼C论坛

 找回密码
 立即注册
查看: 1589|回复: 5

[已解决]请问关于局部变量的问题,为何会报错?

[复制链接]
发表于 2017-4-9 15:17:09 | 显示全部楼层 |阅读模式

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

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

x
hehe=6
def f():
      print(hehe)
      hehe=2
f()
print(hehe)
请问为何会报错未定义变量
hehe = 2是局部变量,不是可以无视吗
最佳答案
2017-4-9 18:27:42
Python的作用域分为四个:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
当Python查找一个变量是会按L-->E-->G-->-->B的顺序查找,并且当你在函数内部对一个和全局变量同名的变量进行赋值的话,局部变量会覆盖全局变量但不会影响全局变量的值
但是你是在函数内部先打印的变量hehe,并且此前没在函数内声明变量hehe,Python进行变量查找,在全局作用域找到了hehe,就把hehe看做全局变量,但是你后来又对hehe进行了赋值,此时Python重新把hehe看做是局部变量,但这样一来你是先打印的hehe然后才给局部变量hehe赋值,Python就会报错,说你没给局部变量赋值就使用了它
想修改错误你可以在函数内声明hehe就是全局变量:
  1. hehe=6
  2. def f():
  3.      global hehe
  4.      #全局变量声明
  5.      print(hehe)
  6.      hehe=2
  7. f()
  8. print(hehe)
复制代码

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

使用道具 举报

发表于 2017-4-9 15:23:54 | 显示全部楼层
  1. hehe=6
  2. def f():
  3.     hehe=2
  4.     print(hehe)
  5. f()
  6. print(hehe)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-9 16:57:36 | 显示全部楼层
本帖最后由 hikaru2015 于 2017-4-9 17:07 编辑


我知道这样是可以运行的,但上面不能运行的原因是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 17:11:11 | 显示全部楼层
hikaru2015 发表于 2017-4-9 16:57
我知道这样是可以运行的,但上面不能运行的原因是什么?

因为Python是解释性语言,它是一行一行读取运行的
你先给print(hehe),会打印6
但是后面你又加上了hehe=2
Python就检测不到函数中的打印是要打印哪个hehe了
而不是打印hehe=6那个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 17:12:57 | 显示全部楼层
  1. hehe=6
  2. def f():
  3.       print(hehe)
  4.       
  5. f()
  6. print(hehe)
复制代码

运行这个
在运行这个
  1. hehe=6
  2. def f():
  3.       hehe=2
  4.       print(hehe)
  5.       
  6. f()
  7. print(hehe)
复制代码

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

使用道具 举报

发表于 2017-4-9 18:27:42 | 显示全部楼层    本楼为最佳答案   
Python的作用域分为四个:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
当Python查找一个变量是会按L-->E-->G-->-->B的顺序查找,并且当你在函数内部对一个和全局变量同名的变量进行赋值的话,局部变量会覆盖全局变量但不会影响全局变量的值
但是你是在函数内部先打印的变量hehe,并且此前没在函数内声明变量hehe,Python进行变量查找,在全局作用域找到了hehe,就把hehe看做全局变量,但是你后来又对hehe进行了赋值,此时Python重新把hehe看做是局部变量,但这样一来你是先打印的hehe然后才给局部变量hehe赋值,Python就会报错,说你没给局部变量赋值就使用了它
想修改错误你可以在函数内声明hehe就是全局变量:
  1. hehe=6
  2. def f():
  3.      global hehe
  4.      #全局变量声明
  5.      print(hehe)
  6.      hehe=2
  7. f()
  8. print(hehe)
复制代码

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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