我对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
这只是一个简单的例子,我不会列出其他差异。任何人都可以详细解释他们在范围界定方面的差异。
答案 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以获得解释。但是,它仍然不允许将变量的范围限制为特定块。