Python嵌套函数变量作用域[重复]

这个问题在这里已经有答案了
具有嵌套函数作用域的UnboundLocalError

(4个答案)

三年前关闭的

我已经阅读了关于这个主题的几乎所有其他问题,但我的代码仍然不起作用

我想我遗漏了一些关于python变量作用域的内容

这是我的密码:

价格范围={
64:(25, 0.35),
32:(13, 0.40),
16:(7, 0.45),
8:(4, 0.5)
}
def get_order_总计(数量):
全球价格区间
_总数=0
_i=价格范围。iterkeys()
def递归(_i):
尝试:
key=_i.next()
如果数量%key!=数量:
_合计+=价格范围[关键点][0]
返回递归(_i)
除停止迭代外:
退货(键,数量百分比键)
res=递归(_i)

我得到

“全局名称’\u total’未定义”

我知道问题出在\u total作业上,但我不明白为什么。
recurse()不应该访问父函数的变量吗

有人能给我解释一下python变量作用域缺少什么吗

在Python3中,可以使用nonlocal语句访问非本地、非全局范围

非局部语句使变量定义绑定到最近范围内先前创建的变量。以下是一些例子来说明:

def sum\u list\u项目(\u list):
总数=0
def do_总和(_列表):
对于i in_列表:
总数+=i
不计算总和(列表)
返回总数
汇总列表项([1,2,3])

上述示例将失败,错误为:UnboundLocalError:assignment之前引用的局部变量“total”

使用非本地我们可以让代码正常工作:

def sum\u list\u项目(\u list):
总数=0
def do_总和(_列表):
#将total变量定义为非局部变量,使其绑定
#到最近的非全局变量,也称为total。
非局部合计
对于i in_列表:
总数+=i
不计算总和(列表)
返回总数
汇总列表项([1,2,3])

但“最近的”是什么意思?下面是另一个例子:

def sum\u list\u项目(\u list):
总数=0
def do_总和(_列表):
#非局部合计绑定到此变量。
总数=0
def do_核心计算(_列表):
#将total变量定义为非局部变量,使其绑定
#到最近的非全局变量,也称为total。
非局部合计
对于i in_列表:
总数+=i
进行核心计算(列表)
不计算总和(列表)
返回总数
汇总列表项([1,2,3])

在上面的示例中,total将绑定到do\u sum函数中定义的变量,而不是sum\u list\u items函数中定义的外部变量,因此代码将返回0

def sum\u list\u项目(\u list):
#非局部合计绑定到此变量。
总数=0
def do_总和(_列表):
def do_核心计算(_列表):
#将total变量定义为非局部变量,使其绑定
#到最近的非全局变量,也称为total。
非局部合计
对于i in_列表:
总数+=i
进行核心计算(列表)
不计算总和(列表)
返回总数
汇总列表项([1,2,3])

在上面的示例中,非局部赋值在定位total变量(该变量是sum\u list\u items的局部变量)之前会向上遍历两个级别

发表评论