我对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}$这只是一个简单的例子,我不打算列举其他不同之处。有谁能详细解释一下他们在范围界定上的差异吗。在
Python只区分两个变量范围-局部和全局。在
全局变量与C/C++一样,即全局可访问,并保持其值交叉函数调用。在
局部变量是函数的局部变量(类似于JavaScript)。内部块中的任何修改都会修改整个函数范围的变量。在
编辑:多亏了这些评论,我忘记了
nonlocal
语句。这允许从内部函数引用到封闭函数中的变量,请检查here以获取解释。但是,它仍然不允许将变量的范围限制为特定的块。在Python不提供块范围。变量的最小作用域是函数(类似于ES6之前的Javascript)。在
这种设计的最初原因(如果我理解正确的话)是,如果您需要块范围变量,那么无论如何代码可能太复杂了,分解函数是一个好主意(注意,您可以在Python中创建局部函数/闭包,所以这并不一定意味着代码需要像它一样进行扩展和去本地化会发生在C)。在
作为这个“无块范围”规则的一个例外,Python3变量在理解内部被使用,即在理解之后
在Python2中,
i
将为9,但Python3中的表达式中不会泄漏任何变量i
。在Python的作用域规则不是很复杂:如果在函数体中有赋值(或者像
+=
-=
等等)的赋值,那么这个变量就被认为是一个局部变量,如果只是为了读取变量而访问它,那么这个变量就被认为是来自外部作用域(如果函数在顶层,则是全局的)。在如果需要修改函数中的全局变量(不是经常发生的事情),则需要用
global
显式地声明它。在在Python3中,还可以通过使用
nonlocal
声明访问内部函数中捕获的局部变量以进行写入。在Python2中,只能访问捕捉到的局部变量以读取内部函数(赋值将使它们成为内部函数的局部变量,global
声明将使它们成为全局变量)。在相关问题 更多 >
编程相关推荐