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中
python的作用域规则并不十分复杂:如果函数体中有赋值(或像
如果需要在函数中修改全局(而不是经常发生的事情),则需要使用
在python3中,还可以使用
python只区分两个变量作用域-局部作用域和全局作用域。
全局变量与C/C++中的变量相同,即全局可访问并保持其值交叉函数调用。
局部变量是函数的局部变量(类似于javascript)。内部块中的任何修改都会修改整个函数范围的变量。
编辑:多亏了这些评论,我忘记了