非局部变量与静态变量相同吗?

问题描述 投票:2回答:3

在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 c++ python-3.x programming-languages
3个回答
6
投票

如果我们在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只是关于嵌套作用域的解析;跨外部函数调用没有全局持久性(但是跨同一外部函数调用对内部函数的多个调用)。


1
投票

我对C ++中static的理解是,它可能具有多种含义。

[据我理解,在C ++中,“ static”的含义是一个变量,它在两次调用之间保持状态。 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()

此代码的输出将如下所示内部:非本地外:非本地计数器是1计数器是2计数器是3

变量foo.counter与C ++中的static关键字等效。我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.