更多课程 选择中心

Python培训
美国上市教育机构

400-111-8989

Python培训

Python变量名与作用域的坑

  • 发布:Python培训
  • 来源:练习题库
  • 时间:2017-09-19 17:36

不管你是正准备学习Python的小白,还是刚入门的菜鸟,亦或是经验丰富的大牛,你们学习一门语言的第一步都是一样的,那就是——基础知识。但是很多人可能在学习的过程中忽略了基础知识的重要性。今天,我们就来为大家分享一个由于基础知识不扎实而误入的坑。

一位有多年Python使用经验者的分享

使用python有些年头了,自认为对Python的基本知识很了解了,某天发生的一件事让我对Python有了更多的认识。

某一天小伙伴让我帮忙看以下一段代码,具体内容和函数名字可以不用太过在意,命名上做了一些特殊处理,但是不影响代码逻辑和要表达的意思。

for循环中当node_type为fb时,将FBX对象返回并作为全局变量dut(node_name的内容是字符串dut),接下来print dut,报错。

错误信息如下:


小伙伴提到,如果将with cli_ctx as dut这个block删除掉,代码执行正常。听到这里,我的第一反应是变量作用域的问题,但是也无法道出其中原委,于是建议我的小伙伴,将context manager那一段代码改成with cli_ctx as d,重新尝试一下是否有问题,同时我在网上继续搜索相关的原因,之后由结果和理论结合分析问题的原因。

幸运的是,代码修改以后,执行正常,我也找到了一些文章来解释这个问题,我的第一感觉也没有错,的确是变量作用域的问题,代码在执行过程中,print dut实际上是在访问Local variable,而不是我们期望的global variable dut。

参考 Python 的官方文档和搜索到的资料,总结出具体原因如下:

当搜索一个变量的时候,先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,就会在全局变量中找这个变量,如果找不到抛出异常Unbound-LocalError。

如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改,那么 python 会认为它是一个局部变量。因为对变量的定义在代码块以外,当前代码块中没有变量的定义和赋值,所以报错。

在我们的代码中,全局变量 dut 虽然创建了,但是由于在函数代码块中,下文中有 context manager cli_ctx对变量dut进行了赋值操作,导致在函数block中,dut成为了局部变量,而非全局变量。

对变量赋值的操作“=”是很明显的语句,其他不是那么明显的赋值操作有:for循环中的赋值,except语句中的赋值,with...as...{var}中的var。

总结:避免误入一些不必要的坑,基础知识一定要学扎实!


预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Python基础篇:一个小时搭建一个全栈 Web 应用框架
下一篇:搭建python数据分析平台教程

Python编程练习三

Python正则表达式练习

Python 2的结束意味着什么

用python做一个划词翻译软件

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省