全局变量与局部变量

Python学习之路:局部变量和全局变量
全局变量在第一层级,作用于整个代码块;局部变量只作用于所在函数域;局部变量变成全局变量需声明global(不建议使用,不便于复杂程序调试);
school =“Oldboy edu.”#全局变量

def change_name(name):
global school #将函数中的局部变量改成全局变量
school=“Mage Linux”#局部变量
print(“before change”,name,school)
name =“Alex li”#局部变量,只在函数中生效,这个函数(change_name)就是这个变量(name)的作用域
print(“after change”,name)

name = ‘alex’
change_name(name)
print(name,school)
注释掉全部代码:ctrl+?

school =“oldboy edu.”
names =[“alex”,“jack”,“Rain”]
def change_name():
names[0] =“金角大王”#列表、字典、集合和类都可以在局部变量中改,字符串和整数不能改
print(“inside func”,names)
change_name()
print(names)

全局变量与局部变量两者的本质区别就是在于作用域

用通俗的话来理解的话,

全局变量是在整个py文件中声明,全局范围内都可以访问

局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了

如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的。因此不建议这样使用,这样会使得程序很不健全

直接来看几个例子来理解全局变量和局部变量的区别吧:

Demo1:

def fun(x):
y=2
print(“乘法的运行结果:”,x*y)
num1=1
print(“初始num1=”,num1)
fun(num1)
print(“y的值是:”,y)
运行结果:
在这里插入图片描述

报错的原因是因为试图访问局部变量,但是访问的地方不在该变量y的作用域中

Demo2:

def fun():
num1=2
print(“函数内修改后num1=”,num1)
num1=1
print(“初始num1=”,num1)
fun()
print(“运行完函数后num1=”,num1)
运行结果:

在这里插入图片描述

可以看到在函数内部对全局变量的修改后,在函数执行完毕,修改的结果是无效的,全局变量并不会受到影响

再看:

Demo3:

def fun():
num1*=2
print(“函数内修改后num1=”,num1)
num1=1
print(“初始num1=”,num1)
fun()
print(“运行完函数后num1=”,num1)
运行结果:

在这里插入图片描述

报错了。这是因为在fun()函数使用了局部变量num1,它只是个跟全局变量同名的局部变量,使用前还是要赋值,因此再次强调不要这样使用

global关键字

如果真的想要在函数体内修改全局变量的值,就要使用global关键字

Demo4:

def fun():
global num1
num1=2
print(“函数内修改后num1=”,num1)
num1=1
print(“初始num1=”,num1)
fun()
print(“运行完函数后num1=”,num1)

运行结果:

在这里插入图片描述
使用global关键字就是告诉python编译器这个变量不是局部变量而是全局变量,其实有点像是"引用"的意思

nonlocal关键字

再看看另一个跟变量相关的关键字nonlocal,字面意思就是指当前的这个变量不是局部变量。nonlocal是Python3.0中新增的关键字,python2.x不支持

先来看看下面这段代码

def fun():
num2=3
def fun2():
num2*=2
print(“num2=”,num2)
return fun2()

fun()
运行结果:

在这里插入图片描述

错误的原因跟前面的差不多,就是使用了未定义的局部变量,然而num2也不是全局变量,只是fun2函数的外层变量,强行使用global定义num2的话同样会报错(不信你试试)

这时候需要使用nonlocal关键字:

def fun():
num2=3
def fun2():
nonlocal num2
num2*=2
print(“num2=”,num2)
return fun2()

fun()
运行结果:

在这里插入图片描述

如此,程序就能正常执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值