请选择 进入手机版 | 继续访问电脑版
楼主: lg21c
832 6

python解释器会“预读”? [推广有奖]

  • 1关注
  • 11粉丝

教授

25%

还不是VIP/贵宾

-

威望
0
论坛币
422 个
通用积分
23.2071
学术水平
5 点
热心指数
9 点
信用等级
2 点
经验
25564 点
帖子
585
精华
0
在线时间
1304 小时
注册时间
2005-10-11
最后登录
2024-3-20

lg21c 发表于 2018-9-30 11:32:02 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
a = 1
def test():
    print(a)
test()
这段代码可以正常运行,print(a)输出“1”

a =1
def test():
    print(a)
    a=2
test()
这段代码仅仅在“print(a)”后边添加了“a=2”,就出错了“UnboundLocalError: local variable 'a' referenced before assignment
连print(a)也不能运行了

何故?python解释器会“预读”后续代码?

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 解释器 assignment Reference Variable

lg21c 发表于 2018-9-30 11:33:06 |显示全部楼层 |坛友微信交流群
这个说法似乎有道理http://blog.cipherc.com/2015/04/25/python_namespace_and_scope/
根据Python[“静态定义,动态使用”](https://stackoverflow.com/questions/39801617/what-does-it-mean-that-a-scope-is-determined-statically-and-used-dynamically)的规则,代码在执行到print时,解释器早已把整个函数加载到内存,并知道b变量未定义。于是报错。

大家认为?请高手指点

使用道具

lg21c 发表于 2018-9-30 11:38:14 |显示全部楼层 |坛友微信交流群
作为解释型的语言,应该是逐句运行的,怎么把握python的这个问题?

使用道具

fmsu_я 发表于 2018-9-30 12:30:17 来自手机 |显示全部楼层 |坛友微信交流群
local variable \'a\' referenced before assignments-授予前的局部变量a. 粗略分析可能是函数不完整导致的.只是参考.验证其语句可用性需要再赋予完整函数再调试.

使用道具

lg21c 发表于 2018-10-1 09:09:15 |显示全部楼层 |坛友微信交流群
fmsu_я 发表于 2018-9-30 12:30
local variable \'a\' referenced before assignments-授予前的局部变量a. 粗略分析可能是函数不完整导致的 ...
函数不完整?不存在这个问题啊

使用道具

fmsu_я 发表于 2018-10-1 13:03:36 来自手机 |显示全部楼层 |坛友微信交流群
@lg21c我不是高手,只是提供个也许可行的正确调试办法.如果如果还不行,再排查用其他办法.其他没留言的号,不想承担过多风险.就不回复了.平安是福.

使用道具

lg21c 发表于 2018-10-18 10:08:21 |显示全部楼层 |坛友微信交流群
这个地方有这种解释https://www.cnblogs.com/fireporsche/p/7813961.html:Python中的模块代码在执行之前,并不会经过预编译,但是模块内的函数体代码在运行前会经过预编译,因此不管变量名的绑定发生在作用域的那个位置,都能被编译器知道。Python虽然是一个静态作用域语言,但变量名查找是动态发生的,直到在程序运行时,才会发现作用域方面的问题
本质上还是Python调用变量时遵循的LEGB法则和Python解析器的编译原理,决定了这个错误的发生

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 10:24