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

2024-06-16 13:57:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

C++中的P>:

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

^{pr2}$

这只是一个简单的例子,我不打算列举其他不同之处。有谁能详细解释一下他们在范围界定上的差异吗。在


Tags: offorreturnmain错误errorout例子
2条回答

Python只区分两个变量范围-局部和全局。在

全局变量与C/C++一样,即全局可访问,并保持其值交叉函数调用。在

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

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

Python不提供块范围。变量的最小作用域是函数(类似于ES6之前的Javascript)。在

这种设计的最初原因(如果我理解正确的话)是,如果您需要块范围变量,那么无论如何代码可能太复杂了,分解函数是一个好主意(注意,您可以在Python中创建局部函数/闭包,所以这并不一定意味着代码需要像它一样进行扩展和去本地化会发生在C)。在

作为这个“无块范围”规则的一个例外,Python3变量在理解内部被使用,即在理解之后

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

在Python2中,i将为9,但Python3中的表达式中不会泄漏任何变量i。在

Python的作用域规则不是很复杂:如果在函数体中有赋值(或者像+=-=等等)的赋值,那么这个变量就被认为是一个局部变量,如果只是为了读取变量而访问它,那么这个变量就被认为是来自外部作用域(如果函数在顶层,则是全局的)。在

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

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

相关问题 更多 >