在python中,我们有一个名为nonlocal
的关键字。与C ++中的static
相同吗?如果我们在python中有嵌套函数,而不是在内部函数内部使用非局部函数,我们是否只能在外部函数中声明变量?这样,它将是真正的nonlocal
。
说明:static
关键字,以下在C ++中使用:
#include <iostream>
int foo () {
static int sVar = 5;
sVar++;
return sVar;
}
using namespace std;
int main () {
int iter = 0;
do {
cout << "Svar :" foo() << endl;
iter++;
} while (iter < 3);
}
通过迭代提供输出:
Svar :6
Svar :7
Svar :8
所以,Svar保留了它的价值。
如果我们在python中有嵌套函数,而不是在内部函数内部使用非局部函数,我们是否只能在外部函数中声明变量?
没有如果省略nonlocal
,则内部函数中的赋值将创建一个新的本地副本,而忽略外部上下文中的声明。
def test1():
x = "Foo"
def test1_inner():
x = "Bar"
test1_inner()
return x
def test2():
x = "Foo"
def test2_inner():
nonlocal x
x = "Bar"
test2_inner()
return x
print(test1())
print(test2())
...发出:
Foo
Bar
与C ++中的static是否相同?
C ++ static
变量实际上只是范围较小的全局变量(即它们是存储在函数调用之间的持久性全局上下文)。
Python nonlocal
只是关于嵌套作用域的解析;跨外部函数调用没有全局持久性(但是跨同一外部函数调用对内部函数的多个调用)。
我对C ++中static
的理解是,它可能具有多种含义。
[据我理解,在C ++中,“ static
”的含义是一个变量,它在两次调用之间保持状态。 python中最接近的是global
变量。
nonlocal
将嵌套函数中的值的生存期限制为封闭函数的生存期。这是global
和local
之间的折衷。
如果要在内部函数中省略nonlocal
,则变量将具有与内部函数相同的作用域和生存期。除非您当然是在阅读而不是在编写它,否则在这种情况下它将与封闭函数的范围匹配,但不能维护内部函数的任何状态。
“ nonlocal”不是静态的。考虑以下示例
def outer():
x = "local"
def inner():
nonlocal x
x = "nonlocal"
print("inner:", x)
inner()
print("outer:", x)
def foo():
foo.counter += 1
print("Counter is", foo.counter)
outer()
foo.counter = 0
foo()
foo()
foo()
此代码的输出将如下所示内部:非本地外:非本地计数器是1计数器是2计数器是3
变量foo.counter
与C ++中的static关键字等效。我希望这会有所帮助。