Python和C ++之间的变量范围有什么不同(如果存在)?

What are the differences (if exist) in variable scope between Python and C++?

本问题已经有最佳答案,请猛点这里访问。

我对python的变量范围有点困惑。也许因为习惯了C++的约定,所以我总是在Python的变量范围内犯了一些错误。例如:

在C++中:

1
2
3
4
5
6
7
8
9
int main(){
    int i = 3;
    for (int j = 0; j <= 3; ++j){
        i += 1;
    }
    cout <<"i =" << i << endl;
    cout <<"j =" << j << endl; //Error, out of 'for' scoping.
    return 0;
}

但在Python:

1
2
3
4
5
6
7
i = 3
for j in range(1,4):
    i += 1
print j               # j = 3, nothing wrong
for i in range(5,7):
    j += 1
print i               # i = 6, changed by operation in for loop

这只是一个简单的例子,我不想列出其他的区别。谁能详细解释一下他们在范围界定上的差异吗?


python不提供块范围。变量的最小作用域是函数(就像发生在ES6之前的javascript中一样)。

这种设计的最初原因(如果我理解正确的话)是,如果您需要块范围变量,那么代码可能太复杂了,将函数分解是一个好主意(注意,您可以在python中创建局部函数/闭包,因此这不一定意味着代码需要像wou一样进行分散和非定域化。会发生在c)。

作为"无块范围"规则的一个例外,在理解中使用了python3变量,使理解成为局部变量,即在

1
x = [i*i for i in range(10)]

python2中i为9,但python3中的表达不会泄漏变量i

python的作用域规则并不十分复杂:如果函数体中有赋值(或像+=-=等增广的赋值),那么该变量被视为局部变量,如果它只被访问以读取变量,则该变量被视为来自外部作用域(如果函数位于顶层,则被视为全局变量)。l)。

如果需要在函数中修改全局(而不是经常发生的事情),则需要使用global显式声明它。

在python3中,还可以使用nonlocal声明访问内部函数中捕获的用于写入的局部变量。在python2中,只能访问捕获的局部变量以读取内部函数(赋值将使它们成为内部函数的局部变量,而global声明将使它们成为全局变量)。


python只区分两个变量作用域-局部作用域和全局作用域。

全局变量与C/C++中的变量相同,即全局可访问并保持其值交叉函数调用。

局部变量是函数的局部变量(类似于javascript)。内部块中的任何修改都会修改整个函数范围的变量。

编辑:多亏了这些评论,我忘记了nonlocal声明。这允许从内部函数引用到封闭函数中的变量,请检查此处以获取解释。但是,它仍然不允许将变量的范围限制为特定的块。