python嵌套函数作用域怎么解释
问题描述
直接上代码
def l(list): def d():return list return d #运行l = l([1,2,3,4])print l()
这个情况是正常的。
问题在于d函数为什么不能传入list,然后我现在尝试了一下这个代码:
def l(list): def d(list):return list return d #运行l = l([1,2,3,4])#提示错误print l()#正常print l([1,3,5,7,9])
请问这个怎么解释呢?我个人理解的是,类似于“继承”的情况,当d函数没有参数传入的情况上,基于父函数的参数,当他需要传参了,就覆盖了???
问题解答
回答1:看看LEGB原则,就会明白是怎么回事。https://zhuanlan.zhihu.com/p/...
运行l = l([1,2,3,4])
提示错误print l() 这个错误是你没有传参数。
回答2:原有代码中:
def l(list): def d(list):return list return d # <-- 这里是返回的一个要传入一个参数的函数 #运行l = l([1,2,3,4])#提示错误print l() # <-- 这里没有传入参数报错,这里的 l 是 返回的闭包 d#正常print l([1,3,5,7,9]) # <-- 这里的 l 已经不是你最初定义的 l 而是 最初 l 中返回的 d
下面的用于说明:你原来代码中的 l 指向不同:
def l(list): def d(list):return list return d #运行print ’id(l) is {}’.format(id(l))l = l([1,2,3,4])#提示错误# print l()#正常print ’id(l) is {}’.format(id(l))print l([1,3,5,7,9])
代码写成这样你可能就理解了:
def l(_list): def d(_l):return _list + _l return d a = l([1,2,3,4])print a([1])
最后说两点:
不要使用 list 这样的关键字作为变量名
不要覆盖你的变量名(除非真的有必要)
回答3:楼主需要理解的是: 作用域
case 1: 函数l返回函数d的地址,d只做为返回值,并没有被调用执行.
In [3]: print(l([1,2,3,4]))<function l.<locals>.d at 0x7f49243ece18>
参数list传入l,作用域在函数l内,可以被d访问(注意参数是传给l的,不是d). 如果要访问list.如下调用: `
In [2]: print(l([1,2,3,4])()) [1, 2, 3, 4]
相当于:
In [5]: d = l([1,2,3,4]) # 返回d的地址In [6]: d()#调用d,d没有参数,不需要传参 Out[6]: [1, 2, 3, 4]
case 2: 同样l返回d的地址,但此时返回的函数d需要传参(注意l的参数list和d的参数list是不一样的).
In [8]: d = l([1,2,3,4])# 返回函数d的地址,参数list此时并没有用到In [9]: d([5,6,7,8])# 需要参数的函数d Out[9]: [5, 6, 7, 8]
相关文章:
1. javascript - 一排三个框,各个框的间距是15px,距离外面的白框间距也是15px,这个css怎么写?2. javascript - jQuery post()方法,里面的请求串可以转换为GBK编码么?可以的话怎样转换?3. html5 - vue-cli 装好了 新建项目的好了,找不到项目是怎么回事?4. django - python 2层文件夹导入5. python - 用urllib抓取网页上的下载链接,目标文件是xls形式,但发现抓下来的xls是空表,里面只有一句报错信息,求帮助。6. 用CSS3 box-sizing 属性实现两个并排的容器,如果想让容器中间有间隔该如何实现7. mysql - C#连接数据库时一直这一句出问题int i = cmd.ExecuteNonQuery();8. css - ul ol前边的标记如何调整样式呢9. javascript - vue 手机端项目在进入主页后 在进入子页面,直接按返回出现空白情况10. python3.x - python 中的maketrans在utf-8文件中该怎么使用

网公网安备