局部变量与全局变量名一样时
当局部变量和全局变量名字一样时,依然是不同的变量,但是值一样时,地址依然一样,类似于两个不同的指针指向同一个地址。值不一样时,地址不一样,修改局部变量,全局变量的值依然不变,例如:
num = 100
def test():
num = 99
print("局部变量num的值:%d,地址为:%d" % (num, id(num)))
test()
print("全局变量num的值:%d,地址为:%d" % (num, id(num)))
输出:
局部变量num的值:99,地址为:492861520
全局变量num的值:100,地址为:492861552
Python中,当全局变量和局部变量的名字一样时,函数内会优先使用局部变量的值,函数内也没办法通过赋值直接修改全局变量的值。
如果要在局部修改全局变量的值时
修改成如下代码:
num = 100
def test():
global num #告诉解释器num是全局变量
num = 99
print("局部变量num的值:%d,地址为:%d" % (num, id(num)))
test()
print("全局变量num的值:%d,地址为:%d" % (num, id(num)))
输出:
局部变量num的值:99,地址为:492861520
全局变量num的值:99,地址为:492861520
针对函数参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用
def demo(num, num_list):
print("函数内部")
# 赋值语句
num = 200
num_list = [1, 2, 3]
print(num)
print(num_list)
gl_num = 99
gl_list = [4, 5, 6]
demo(gl_num, gl_list)
print("函数外部")
print(gl_num)
print(gl_list)
输出:
函数内部
200
[1, 2, 3]
函数外部
99
[4, 5, 6]
如果传递参数是可变类型,在函数内部,使用方法修改了数据的内容,同样会影响到外部的数据
def demo(num_list):
print("函数内部")
# 使用方法修改内部的代码
num_list.append(9)
print(num_list)
gl_list = [1, 2, 3]
demo(gl_list)
print("函数外部")
print(gl_list)
输出:
函数内部
[1, 2, 3, 9]
函数外部
[1, 2, 3, 9]