gpt4 book ai didi

javascript - 在 python 中关闭。我可以关闭函数的局部上下文吗?

转载 作者:行者123 更新时间:2023-11-28 19:49:22 26 4
gpt4 key购买 nike

在 javascript 中,我可以像这样编写带有闭包的函数

function getUniqueIDfunction() { 
var id = 0;
return function() { return id++; };
};

然后使用它

uniqueID = getUniqueIDfunction();
uniqueID(); //return 0
uniqueID(); //return 1
...

我可以在 Python 中执行相同的操作吗(如果它取决于不同的版本请告诉我)?

def getUniqueIDfunction():
x = -1
def foo():
#And I know that it doesn't work with row bellow and without it
#global x
x += 1
return x
return foo

这只是一个示例。我想了解 Python 中的闭包。

最佳答案

Python 3 通过 PEP 3104 引入了这种作用域行为和 nonlocal 语句:

>>> def uniqueId ():
x = -1
def inner ():
nonlocal x
x += 1
return x
return inner

>>> f = uniqueId()
>>> f()
0
>>> f()
1
>>> f()
2

除此之外,在以前的版本中,确实存在闭包,但您只有只读权限。所以改变 x 是行不通的。然而,你可以做的是使用一个可变对象,比如一个列表,然后改变它:

>>> def uniqueId ():
x = [-1]
def inner ():
x[0] += 1
return x[0]
return inner

>>> f = uniqueId()
>>> f()
0
>>> f()
1

由于您可以使任何类型的对象可调用,您还可以通过定义自己的具有 __call__ 方法的类型来做一些更奇特的事情:

>>> class UniqueId:
def __init__ (self):
self.x = -1
def __call__ (self):
self.x += 1
return self.x

>>> f = UniqueId()
>>> f()
0
>>> f()
1

关于javascript - 在 python 中关闭。我可以关闭函数的局部上下文吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19799284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com