Python 2.X版本中闭包是怎么实现的?,python2.x,大家怎么用Python


大家怎么用Python 2.x 实现闭包?

简单的:

def func(a):    def inner(b):        return a+b    return innerc = func(5)print c(4)

这个说明不了问题,给你个真的:

def filter_scale(func):    def wrapper(**args):        if args["img_url"] == None:            return func(**args)        v = float(args["height"])/float(args["width"])        if v >=1.3 and v <= 1.6:            return func(**args)        else:            return func(img_url=None)    return wrapper

配合装饰器:

@filter_size@filter_scaledef get_img(**args):    return args

问题的主要原因在于:
在Python中string, int, float, tuple这些基本类型都是immutable的。即使是如int, float这种"基础"类型,若值不同,会赋值给另外一个PyObject,这点与lua, javascript等语言不一样。

你可以在Python REPL中测试这几行:

i = 1id(i)i = 2  # 改变i的值id(i)  # 注意两个id不同

这就是为什么需要使用list, dict的原因(class, function本身也是dict,可以利用上来)。
就你的例子来说,也可以这样写:

def counter():    i = 0    def inner():        inner.i += 1        return inner.i    inner.i = i    return innerc1 = counter()c2 = counter()print c1()print c1()print c2()print c2()

Python 的在网上搜了下, 感觉都不对啊.
lua版的 :

function counter()local i = 0return function()       i = i + 1       return i       endend
> c1 = counter()> print(c1())1> print(c1())2> c2 = counter()> print(c2())1> print(c2())2> print(c2())3

Python也有人用list实现.

编橙之家文章,

评论关闭