直接上python代码
X = 1
Y = 2
def func1():
X = X + Y # error
func1()
这段代码中X = X + Y
,python是无法识别左边的X是局部变量,右边的X是全局变量的。
同样,我们使用C++来实现上面python代码的相同操作,如下:
#include<iostream>
using std::cout;
using std::endl;
int X = 1;
int Y = 2;
void func()
{
cout << X << '\t' << Y << endl;
int X = X + Y;
cout << X << endl;
}
int main()
{
func();
}
使用GCC9.3.0编译上面的C++,没有语法错误。但是cout << X << endl;
输出的结果是不可预期的。
综合来看,python直接报错比起C++编译通过但是结果不可预期还是要合理的多。
实际来看,一行赋值语句左边的X是局部变量,右边的X是全局变量是不合理的。
X = 1
def fun():
print(X) // error,因为下面又定义了局部变量X,因此fun函数作用域内只可见局部X,但是不能再未定义X之前使用X。
X = 2
print(X)
fun()
python的作用域是明确的,在fun内如果没有定义局部变量X,那么就可以使用全局变量X;但是一旦定义了局部变量X,那么全局变量X在该函数内不可见,并且由于只能在定义局部变量X之后才能使用它。因此第一个print(X)就会导致错误。 下面是和上面相同操作的C语言代码,他能顺利编译,执行。并且结果是:
1
0
正如预期的一样,但是在python中对于作用域的限制更加明确。
#include<stdio.h>
int X = 1;
void func2()
{
printf("%d\n", X);
int X = 0;
printf("%d\n", X);
}
int main()
{
func2();
}
总体而言,python中的作用域的限制更加严谨,从而使得作用域导致的错误也进一步下降。