相关疑难解决方法(0)

Python非本地语句

Python nonlocal语句做了什么(在Python 3.0及更高版本中)?

官方Python网站上没有文档,help("nonlocal")也没有用.

python closures global python-nonlocal

293
推荐指数
6
解决办法
10万
查看次数

是否可以在python中修改外部但不是全局范围的变量?

给出以下代码:

def A() :
    b = 1

    def B() :
        # I can access 'b' from here.
        print( b )
        # But can i modify 'b' here? 'global' and assignment will not work.

    B()
A()
Run Code Online (Sandbox Code Playgroud)

对于B()函数变量中的代码,b在外部作用域中,但不在全局作用域中.是否可以bB()函数内修改变量?当然我可以从这里读取它print(),但是如何修改呢?

python python-2.7

95
推荐指数
3
解决办法
5万
查看次数

Python嵌套函数变量作用域

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

我想我错过了一些关于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)
Run Code Online (Sandbox Code Playgroud)

我明白了

"全局名称'_total'未定义"

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

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

python variables scope

82
推荐指数
6
解决办法
7万
查看次数

Python中的闭包

我一直在努力学习Python,虽然我热衷于在Python中使用闭包,但我一直无法使代码正常工作:

def memoize(fn):
    def get(key):
        return (False,)

    def vset(key, value):
        global get
        oldget = get
        def newget(ky):
            if key==ky: return (True, value)
            return oldget(ky)
        get = newget

    def mfun(*args):
        cache = get(args)
        if (cache[0]): return cache[1]

        val = apply(fn, args)
        vset(args, val)
        return val

    return mfun

def fib(x):
    if x<2: return x
    return fib(x-1)+fib(x-2)

def fibm(x):
    if x<2: return x
    return fibm(x-1)+fibm(x-2)

fibm = memoize(fibm)
Run Code Online (Sandbox Code Playgroud)

基本上,这应该做的是使用闭包来维持函数的memoized状态.我意识到可能有更快,更容易阅读,并且通常更多'Pythonic'方式来实现这一点; 但是,我的目标是准确理解闭包在Python中是如何工作的,以及它们与Lisp的区别,所以我对替代解决方案不感兴趣,为什么我的代码不起作用以及我可以做什么(如果有的话)修复它.

我遇到的问题是当我尝试使用时fibm- Python坚持get没有定义:

Python 2.6.1 (r261:67515, Feb  1 2009, 11:39:55) …
Run Code Online (Sandbox Code Playgroud)

python closures lexical-scope

7
推荐指数
2
解决办法
2747
查看次数