扫码关注官方订阅号
大家怎么用Python 2.x 实现闭包?
光阴似箭催人老,日月如移越少年。
问题的主要原因在于: 在Python中string, int, float, tuple这些基本类型都是immutable的。即使是如int, float这种"基础"类型,若值不同,会赋值给另外一个PyObject,这点与lua, javascript等语言不一样。
你可以在Python REPL中测试这几行:
i = 1 id(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 inner c1 = counter() c2 = counter() print c1() print c1() print c2() print c2()
简单的:
def func(a): def inner(b): return a+b return inner c = 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_scale def get_img(**args): return args
参考:http://www.cnblogs.com/huxi/archive/2...
Python 的在网上搜了下, 感觉都不对啊. lua版的 :
function counter() local i = 0 return function() i = i + 1 return i end end
> c1 = counter() > print(c1()) 1 > print(c1()) 2 > c2 = counter() > print(c2()) 1 > print(c2()) 2 > print(c2()) 3
Python也有人用list实现.
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
问题的主要原因在于:
在Python中string, int, float, tuple这些基本类型都是immutable的。即使是如int, float这种"基础"类型,若值不同,会赋值给另外一个PyObject,这点与lua, javascript等语言不一样。
你可以在Python REPL中测试这几行:
这就是为什么需要使用list, dict的原因(class, function本身也是dict,可以利用上来)。
就你的例子来说,也可以这样写:
简单的:
这个说明不了问题,给你个真的:
配合装饰器:
参考:
http://www.cnblogs.com/huxi/archive/2...
Python 的在网上搜了下, 感觉都不对啊.
lua版的 :
Python也有人用list实现.