前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >变量作用域经典错误

变量作用域经典错误

作者头像
zy010101
发布2022-01-10 09:41:16
2650
发布2022-01-10 09:41:16
举报
文章被收录于专栏:程序员

变量作用域经典错误1

直接上python代码

代码语言:javascript
复制
X = 1
Y = 2
def func1():
    X = X + Y		# error

func1()

这段代码中X = X + Y,python是无法识别左边的X是局部变量,右边的X是全局变量的。 同样,我们使用C++来实现上面python代码的相同操作,如下:

代码语言:javascript
复制
#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是全局变量是不合理的。

变量作用域经典错误2

代码语言:javascript
复制
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语言代码,他能顺利编译,执行。并且结果是:

代码语言:javascript
复制
1
0

正如预期的一样,但是在python中对于作用域的限制更加明确。

代码语言:javascript
复制
#include<stdio.h>
int X = 1;
void func2()
{
    printf("%d\n", X);
    int X = 0;
    printf("%d\n", X);
}
int main()
{
    func2();
}

总体而言,python中的作用域的限制更加严谨,从而使得作用域导致的错误也进一步下降。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/01/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 变量作用域经典错误1
  • 变量作用域经典错误2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档