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

时间:2016-01-25 07:00:16

标签: python c++ scope

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

在C ++中:

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中:

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

这只是一个简单的例子,我不会列出其他差异。任何人都可以详细解释他们在范围界定方面的差异。

2 个答案:

答案 0 :(得分:3)

Python不提供块范围。变量的最小范围是函数(就像在ES6之前的Javascript中发生的那样)。

这种设计的原因(如果我理解正确的话)是,如果你需要块范围变量,那么代码可能过于复杂并且分解函数是一个好主意(注意你可以创建本地函数/ Python中的闭包所以这并不一定意味着代码需要像C)那样传播和离域化。

作为这个“无块范围”规则的一个例外,在理解中使用的Python3变量在理解中是局部的,即在

之后
x = [i*i for i in range(10)]
Python中的

i为9,但Python3中的表达式不会泄漏变量i

范围界定的Python规则不是很复杂:如果在函数体中有赋值(或者+= -=等增强的分配)那么变量被认为是本地的,如果相反,它仅用于读取变量,被认为来自外部范围(如果函数处于顶层,则为全局变量)。

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

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

答案 1 :(得分:0)

Python仅区分两个变量范围 - 本地和全局。

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

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

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