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


问题内容

这个问题已经在这里有了答案

带有嵌套函数范围的UnboundLocalError (4个答案)

2年前关闭。

我已经阅读了有关该主题的几乎所有其他问题,但是我的代码仍然无法正常工作。

我想我缺少关于python变量范围的东西。

这是我的代码:

PRICE_RANGES = {
                64:(25, 0.35),
                32:(13, 0.40),
                16:(7, 0.45),
                8:(4, 0.5)
                }

def get_order_total(quantity):
    global PRICE_RANGES
    _total = 0
    _i = PRICE_RANGES.iterkeys()
    def recurse(_i):
        try:
            key = _i.next()
            if quantity % key != quantity:
                _total += PRICE_RANGES[key][0]
            return recurse(_i) 
        except StopIteration:
            return (key, quantity % key)

    res = recurse(_i)

我得到

“未定义全局名称’_total’”

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

有人可以向我解释python变量范围我缺少什么吗?


问题答案:

当我运行您的代码时,出现以下错误:

UnboundLocalError: local variable '_total' referenced before assignment

此问题是由以下行引起的:

_total += PRICE_RANGES[key][0]

有关范围和命名空间的文档 说:

Python的一个特殊怪癖是-如果没有有效的global语句- 对名称的分配总是进入最内部的范围
。分配不复制数据,它们只是将名称绑定到对象。

因此,由于该行实际上是在说:

_total = _total + PRICE_RANGES[key][0]

_total在的名称空间中创建recurse()。由于这_total是新的未分配内容,因此您不能在其中使用它。