非局部变量和静态变量是否相同?

3
在Python中,我们有一个叫做nonlocal的关键字。它和C++中的static一样吗?如果在Python中有嵌套函数,我们可以在外部函数中声明变量而不是在内部函数中使用nonlocal,这样它就真正成为了nonlocal
澄清:下面在C++中使用的static关键字:

#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正在保持它的价值。

1
一些代码可以帮助澄清。static是一个关键字,其含义取决于上下文的不同。 - 463035818_is_not_a_number
好的,我会添加一些关于“static”的上下文代码。 - MrProgrammer
然而,这也可能是答案的一部分,但我有种感觉,你在特定的上下文中提到了“静态”。 - 463035818_is_not_a_number
1
顺便提一下,它可以提供一些洞察力来比较不同语言的特性,但很少有两种不同语言的特性是“相同”或等效的。 - 463035818_is_not_a_number
3个回答

6
如果在Python中有嵌套函数,那么不能仅在外部函数中声明变量来替代在内部函数中使用nonlocal。如果省略了"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++中的静态变量相同吗?

C++中的static变量实际上只是具有更小作用域的全局变量(即它们是一种持久的全局上下文,可在函数调用之间存储)。

Python的nonlocal仅涉及嵌套作用域解析; 在外部函数调用的多个内部函数调用之间没有全局持久性(但在同一个外部函数调用的多次内部函数调用之间会有)。


2

我对C++中的static有几个理解。

我理解你所说的"static在C++中"是指一个在调用之间保持状态的变量。在Python中最接近的是global变量。

nonlocal将嵌套函数中的值的生命周期限制为封闭函数的生命周期。它是globallocal之间的折衷。

如果你省略了内部函数中的nonlocal,那么那里的变量将具有与内部函数相同的作用域和生命周期。当然,除非你正在读取而不是写入它,在这种情况下,它将匹配封闭函数的作用域,但不用于维护来自内部函数的任何状态。


0
"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()

这段代码的输出将会是这样的: 内部变量:nonlocal 外部变量:nonlocal 计数器为1 计数器为2 计数器为3

变量foo.counter相当于C++中的static关键字。希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接