Python nonlocal语句做了什么(在Python 3.0及更高版本中)?
官方Python网站上没有文档,help("nonlocal")也没有用.
给出以下代码:
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在外部作用域中,但不在全局作用域中.是否可以b从B()函数内修改变量?当然我可以从这里读取它print(),但是如何修改呢?
我已经阅读了关于该主题的几乎所有其他问题,但我的代码仍然不起作用.
我想我错过了一些关于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,虽然我热衷于在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)