简单了解Python变量作用域正确使用方法
在写代码的时候,免不了要使用变量。但程序中的一个变量并不一定是在哪里都可以被使用,根据情况不同,会有不同的“有效范围”。
看这样一段代码:
deffunc(x): print('Xinthebeginningoffunc(x):',x) x=2 print('Xintheendoffunc(x):',x) x=50func(x)print('Xaftercallingfunc(x):',x)
输出:
Xinthebeginningoffunc(x):50
Xintheendoffunc(x):2
Xaftercallingfunc(x):50
变量x在函数内部被重新赋值。但在调用了函数之后,x的值仍然是50。为什么?
这就得说一下变量的“作用域”:
当函数内部定义了一个变量,无论是作为函数的形参,或是另外定义的变量,它都只在这个函数的内部起作用。函数外即使有和它名称相,另外注意:光理论是不够的。这里顺便送大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙:七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交流讨教!
同的变量,也没有什么关联。这个函数体就是这个变量的作用域。像这样在函数内部定义的变量被称为“局部变量”。
要注意的是,作用域是从变量被定义的位置开始。像这样的写法是有问题的:
deffunc(): print(y) y=2 print(y)
报错:
UnboundLocalError:localvariable'y'referencedbeforeassignment
因为在y=2之前,y并不存在,调用y的值就会出错。
回到开始那个例子:
在函数func外部,定义的变量x,赋值为50,作为参数传给了函数func。而在函数func内部,变量x是形参,它的作用域是整个函数体内部。它与外面的那个x没有关系。只不过它的初始值是由外面那个x传递过来的。
所以,虽然函数体内部的x被重新赋值为2,也不会影响外面那个x的值。
不过有时候,我们希望能够在函数内部去改变一些变量的值,并且这些变量在函数外部同样被使用到。怎么办?
一种方法是,用return把改变后的变量值作为函数返回值传递出来,赋值给对应的变量。比如开始的那个例子,可以在函数结尾加上
returnx
然后把调用改为
x=func(x)
还有一种方法,就是使用“全局变量”。
在Python的函数定义中,可以给变量名前加上global关键字,这样其作用域就不再局限在函数块中,而是全局的作用域。
通过global改写开始的例子:
deffunc(): globalxprint('Xinthebeginningoffunc(x):',x) x=2 print('Xintheendoffunc(x):',x) x=50func()print('Xaftercallingfunc(x):',x)
输出:
Xinthebeginningoffunc(x):50
Xintheendoffunc(x):2
Xaftercallingfunc(x):2
函数func不再提供参数调用。而是通过globalx告诉程序:这个x是一个全局变量。于是函数中的x和外部的x就成为了同一个变
量。这一次,当x在函数func内部被重新赋值后,外部的x也随之改变。
前面讲的局部变量和全局变量是Python中函数作用域最基本的情况。实际上,还有一些略复杂的情况,比如:
deffunc(): print('Xinthebeginningoffunc(x):',x)#x=2 print('Xintheendoffunc(x):',x) x=50func()print('Xaftercallingfunc(x):',x)
输出:
Xinthebeginningoffunc(x):50
Xintheendoffunc(x):50
Xaftercallingfunc(x):50
程序可以正常运行。虽然没有指明global,函数内部还是使用到了外部定义的变量。然而一旦加上
x=2
这句,程序就会报错。因为这时候,x成为一个局部变量,它的作用域从定义处开始,到函数体末尾结束。
建议在写代码的过程中,显式地通过global来使用全局变量,避免在函数中直接使用外部变量。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。