python变量按作用域可分为_Python 变量作用域-补充

本文探讨了Python中的LEGB变量作用域规则,并通过一个实例分析了在HTML模板和Django项目中如何遇到隐藏的变量作用域问题。在前端模板处理时,未正确传递参数导致函数在执行时出现异常。修复该问题后,另一个因参数未定义引发的bug随之浮现。文章强调了理解变量作用域和正确传递参数在开发中的重要性。
摘要由CSDN通过智能技术生成

Python 变量作用域补充

之前写过一篇关于python里面变量作用域的文章,说起python变量的作用域,大家第一反应就是LEGB,解释如下,

L: local 函数内部作用域

E: enclosing 函数内部与内嵌函数之间

G: global 全局作用域

B:build-in 内置作用

虽说对这个定义很是了解,但是还是在开发中踩了坑。有个前后端不分离的项目,前端页面是通过template模板处理的,在html文件里面,函数定义时埋下了一个隐藏风险点。

Python 变量作用域补充

之前写过一篇关于python里面变量作用域的文章,说起python变量的作用域,大家第一反应就是LEGB,解释如下,

L: local 函数内部作用域

E: enclosing 函数内部与内嵌函数之间

G: global 全局作用域

B:build-in 内置作用

虽说对这个定义很是了解,但是还是在开发中踩了坑。有个前后端不分离的项目,前端页面是通过template模板处理的,在html文件里面,函数定义时埋下了一个隐藏风险点。

如图所示,for循环中遍历的是provinces,参数给的是province,这时候你可能觉得代码会直接报bug,因为找不到provinces,但是在实际的用中却没抛出异常,这个是为什么呢?

看下面这个代码,思考一下输出会是什么?

从函数的定义来看,输出的内容肯定和传入的参数没问题,那输出的内容应是nums还是会直接报错呢?按照之前说的变量作用域去分析,输出应该是nums里面的元素,如果找不到nums就会抛出异常。

说完输出内容,我们继续回到上面说的那个bug,我们知道在django里面使用template模板文件,在开始加载模板文件的时候是可以往里面出入参数的,之前一直没有发现这个潜在的隐患,就是因为所有调用的地方都传入了provinces这个参数。恰巧最近一个新的需求的使用到了这个方法,但是没有传入provinces这个参数,函数在执行的时候找不到provinces,抛出异常。把这个修复后,按理说不应该出现问题了,实际情况却不是这样,修复这个问题后,在若干个调用这个方法的地方又出现了另外一个bug,

如图所示,这个时候你可能会问,nums不是存在么,为什么会说num不存在这个异常呢?从函数的定义可以看出,函数内部遍历的是函数传入的参数,和函数外面其他的参数无关,所以调用函数时,会遍历传入的参数num,但是num并没有定义。 上面说的那个新bug就这样产生的,因为他传入参数在一开始没有定义,加载模板文件时也没有传入这个参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值