我在Python教学的过程中发现:几乎所有的编程学习者在开始用函数不久之后,都踩过
局部变量
的坑。几乎每个星期,都会有人在答疑群问到关于作用域使用不当而导致的问题。(前两天我在知识星球里刚回答了一个)
所以,如果你对 「全局变量」、「局部变量」、「形参」、「实参」、「变量作用域」 这几个概念还不是理解得非常清楚,可以读一读今天这篇文章。
这些内容,在我们的教程里都有,包含在了:
这里再帮大家理一下。
首先来看这样一段代码:
deffunc(x):
print('x =', x)
y = 10
x += y
print('x =', x)
return x
a = 5
b = func(a)
print('a =', a)
print('b =', b)
输出:
x = 5
x = 15
a = 5
b = 15
这里,函数 func 的
形参
是 x
,它只在函数内部有效,也就是
作用域仅在函数中
,如果在外部调用它,就会报错。
变量
a 作为
实参
传递给函数 func,所以函数里 x 的值就是 a 的值,但
x 不是 a
,只是现在它俩一样。
变量 y 是函数中定义的
局部变量
,它的作用域同样也仅在函数中。
对 x 进行赋值之后,x 的值发生了变化,但
不会影响
实参 a 的值。
函数的
返回值
是 x
的值,并赋值给了外部的变量 b,所以 b 的值就是 x 的值,但 b 不是 x,此时 x 已不存在。
理解了上面几条之后,我们再修改一下函数:
deffunc(x):
print('x =', x)
x = 10
x += x
print('x =', x)
return x
x = 5
func(x)
print('x =', x)
输出:
x = 5
x = 20
x = 5
解读一下:
函数 func 的
形参
是 x
。
外部变量 x
作为
实参
传递给函数 func,所以函数里 x 的值就是外部 x 的值,但这
两个 x 是两个不同的变量
,只是现在值一样。
变量 x 在函数中被重新赋值 10,但
不会影响
外部变量 x 的值。
对 x 自身做了累加,此时 x 变成 20。
函数的
返回值是 x
的值,但没有赋值给任何变量,所以此返回值没任何作用,函数结束。
外部的变量 x 仍然是一开始的值 5。
但在初学阶段,不建议你这么给变量命名,可能会把自己绕进去。把代码写清楚,多定义几个变量,多分几行代码,反正也不要钱。
那如果要在函数内部修改外部的变量可不可以呢?
可以,用全局变量。
deffunc():
global x
x = 10
x = 5
func()
print('x =', x)
输出:
x = 10
在函数中声明
global x
,程序就会知道这个
x 是一个全局变量
。此时的 x 就是外部的 x,给它赋值的结果自然在函数结束后依然有效。
但这种情况下,你不能再同时将 x 设定为函数的形参。
如果你仅仅需要在函数内部读取外部的参数值而不用修改它的值,那么 global 的声明就不再需要。
deffunc():
y = x
print('y =', y)
x = 5
func()
print('x =', x)
输出:
y = 5
x = 5
写入时 global 的必要在于区分全局变量和局部变量,而读取不存在这样的问题。
以上就是关于 全局变量、局部变量、形参、实参、变量作用域 的一些小知识点,更多内容可以查看我们的入门系列教程。
最后留一个思考题:
deffunc(m):
m[0] = 20m = [4, 5, 6]
return ml = [1, 2, 3]
func(l)
print('l =', l)
思考一下输出会是什么?
然后自己在电脑上或者在线编辑器里输入代码运行下看看结果,再想想为什么。
欢迎留言给出你的解释。
作者:Crossin的编程教室
Crossin的新书【 码上行动:用ChatGPT学会Python编程 】已经上市了。 本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。
购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
添加微信 crossin123 ,加入编程教室共同学习 ~
感谢 转发 和 点赞 的各位~