在函数里面也有可以定义变量,那函数里面的变量名如果和函数外面的变量名重名,会相互影响吗?
1、作用域
1.1、外部不能访问函数内部变量
#外部不能访问内部变量
x=10
def func():
y=1
func()
print(x) '''执行结果:10'''
print(y) '''执行结果:报错,提示'y'未被定义
这里仅输出了函数外部x的值'''
1.2、函数内部能够访问函数外部变量
x = 123
def func():
print(x)
return x + 1
func()
'''执行结果: 123'''
1.3、函数内部不能修改外部变量
x = 123
def func():
x = x + 1
return x
func()
'''UnboundLocalError: local variable 'x' referenced before assignment
这里x被定义为局部变量,仅只用函数内部,所以报错'''
1.4、函数内部和函数外部变量相同,访问内部变量
x = 100
print("执行结果:",x, id(x))
def func():
x = 999
print("执行结果:",x, id(x))
x += 1
return x
a = func()
print("执行结果:",a,id(a))
'''
执行结果: 100 8791370633984
执行结果: 999 38956016
执行结果: 1000 38955984'''
#当函数外部变量(全局变量)和函数内部变量(局部变量)相同时,函数内部变量可以使用外部变量,但不可修改外部变量
#函数内部的变量,作用域只在函数内部,函数内部不可以直接更改函数外部的变量
这里提出一个问题,如果想要去修改外部变量呢?
2、golbal和nonlocal
2.1、golbal全局变量
函数内部如果需要改变全局变量,就需要使用global修饰变量
x = 100 #全局变量
print("执行结果:",x)
def func():
global x #将局部变量修改成全局变量
x += 1
return x
a = func()
print("执行结果:",a)
'''
执行结果: 100
执行结果: 101'''
2.2、nonlocal局部变量
在函数嵌套函数的情况下,同样也有函数作用域的问题,但是python3中提供了方便,只需要使用nonlocal就可以在里层函数内部修改外部函数变量
x=11 #全局变量
def func():
x=99 #局部变量
def func2():
nonlocal x #将内层局部变量变成成外层局部变量
x+=1
return x
return func2()
print("执行结果:",func())