栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从父函数分配给变量:“分配前引用的局部变量”

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从父函数分配给变量:“分配前引用的局部变量”

您在这里看到的是访问变量和分配变量之间的区别。在Python
2.x中,您只能分配给最内部作用域或全局作用域的变量(后者是通过使用global语句完成的)。您可以在任何封闭范围内访问变量,但不能在封闭范围内访问变量,然后在最内部或全局范围内对其进行分配。

这意味着如果在函数内部对名称进行了任何分配,则在访问名称之前,必须已经在最内部的作用域中定义了该名称(除非使用了全局语句)。在您的代码中,该行

c +=3
基本上等同于以下内容:

tmp = cc = tmp + 3

由于

c
函数中有分配给,因此该函数中的
所有其他出现
c
都只会在的本地范围内查找
funcB
。这就是为什么您看到错误的原因,您试图访问
c
以获取其的当前值
+=
,但
c
尚未定义本地范围。

在Python
3中,您可以通过使用nonlocal语句解决此问题,该语句允许您将变量分配给不在当前范围内但也不在全局范围内的变量。

您的代码看起来像这样,在顶部的类似行

funcC

   def funcB():      nonlocal c      c += 3      ...

在Python 2.x中,这不是选项,更改非局部变量值的唯一方法是可变。

最简单的方法是将您的值包装在一个列表中,然后在您之前刚刚使用变量名称的每个位置修改和访问该列表的第一个元素:

def funcA():   print "funcA"   c = [0]   def funcB():      c[0] += 3      print "funcB", c[0]   def funcC():      c[0] = 5      print "funcC", c[0]   print "c", c[0]   funcB()   funcC()   funcB()   funcC()   print "end"funcA()

…以及输出:

funcAc 0funcB 3funcC 5funcB 8funcC 5end


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516821.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号