我得到了一段这样的代码:
foo = None
def outer():
global foo
foo = 0
def make_id():
global foo
foo += 1
return foo
id1 = make_id() # id = 1
id2 = make_id() # id = 2
id3 = make_id() # ...
我发现在最外层的scop中定义foo
很难看,我更愿意只在outer
函数中使用它。据我理解,在Python3中,这是由nonlocal
完成的。对于我想拥有的东西,有更好的方法吗?我希望在foo
中声明并分配outer
,并在global
中对inner
进行delcare {<1}}:
def outer():
foo = 0
def make_id():
global foo
foo += 1 # (A)
return foo
id1 = make_id() # id = 1
id2 = make_id() # id = 2
id3 = make_id() # ...
(A)不起作用,似乎在最外层范围内搜索foo
。
答案 0 :(得分:6)
我为此目的使用1元素列表:
def outer():
foo = [0]
def make_id():
r = foo[0]
foo[0] += 1
return r
return make_id
make_id = outer()
id1 = make_id()
id2 = make_id()
...
这与使用nonlocal
相同,代价是稍微繁琐的语法(foo[0]
而不是foo
)。
答案 1 :(得分:4)
不,将此作为make_id
功能的参数。更好的是将你的id放在一个类中,并将make_id
作为实例方法,并将该实例作为全局(如果必须)。
答案 2 :(得分:0)
不,它的最佳选择是功能属性。