Python常见问题:全局变量和局部变量

简介: 我在Python教学的过程中发现:几乎所有的编程学习者在开始用函数不久之后,都踩过局部变量的坑。几乎每个星期,都会有人在答疑群问到关于作用域使用不当而导致的问题。(前两天我在知识星球里刚回答了一个)

零基础python入门教程:python666.cn


大家好,欢迎来到 Crossin的编程教室 !


我在Python教学的过程中发现:几乎所有的编程学习者在开始用函数不久之后,都踩过局部变量的坑。几乎每个星期,都会有人在答疑群问到关于作用域使用不当而导致的问题。(前两天我在知识星球里刚回答了一个)


所以,如果你对“全局变量”、“局部变量”、“形参”、“实参”、“变量作用域”这几个概念还不是理解得非常清楚,可以读一读今天这篇文章。


这些内容,在我们的教程里都有,包含在了:


【Python 第67课】函数的参数传递


【Python 第71课】变量的作用域


这里再帮大家理一下。


首先来看这样一段代码:


def func(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 已不存在。


理解了上面几条之后,我们再修改一下函数:


def func(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。


但在初学阶段,不建议你这么给变量命名,可能会把自己绕进去。把代码写清楚,多定义几个变量,多分几行代码,反正也不要钱。


那如果要在函数内部修改外部的变量可不可以呢?


可以,用全局变量。


def func():
    global x
    x = 10
x = 5
func()
print('x =', x)


输出:


x = 10


在函数中声明 global x,程序就会知道这个 x 是一个全局变量。此时的 x 就是外部的 x,给它赋值的结果自然在函数结束后依然有效。


但这种情况下,你不能再同时将 x 设定为函数的形参。


如果你仅仅需要在函数内部读取外部的参数值而不用修改它的值,那么 global 的声明就不再需要。


def func():
    y = x
    print('y =', y)
x = 5
func()
print('x =', x)


输出:


y = 5
x = 5


写入时 global 的必要在于区分全局变量和局部变量,而读取不存在这样的问题。


以上就是关于全局变量、局部变量、形参、实参、变量作用域的一些小知识点,更多内容可以查看我们的入门教程。


最后留一个思考题:


def func(m):
    m[0] = 20
    m = [4, 5, 6]
    return m
l = [1, 2, 3]
func(l)
print('l =', l)


思考一下输出会是什么?


然后自己在电脑上或者我们的在线编辑器(回复 code)里输入代码运行下看看结果,再想想为什么。


欢迎留言给出你的解释。


感谢转发点赞的各位~


_往期文章推荐_


喏,你们要的PyCharm快速上手指南

相关文章
|
5月前
|
Python
Python中通过字符串访问与修改局部变量
Python中通过字符串访问与修改局部变量
71 0
|
3月前
|
编解码 Linux Python
python常见问题|4-10
python常见问题|4-10
|
2月前
|
Java Go C++
【Python】函数的定义和调用、形参和实参、函数的返回值、多元赋值、全局和局部变量
【Python】函数的定义和调用、形参和实参、函数的返回值、多元赋值、全局和局部变量
29 0
|
5月前
|
Linux iOS开发 MacOS
python的virtualenv虚拟环境常见问题和命令
`venv`是Python的内置模块,用于创建隔离的虚拟环境。创建虚拟环境如`python3 -m venv myenv`,激活环境在Windows上是`./venv/Scripts/activate`,在Unix-like系统是`source myenv/bin/activate`。退出环境用`deactivate`。`pip list`查看已安装包,`pip install`安装包,`pip freeze > requirements.txt`保存依赖。PyCharm中红色`venv`表示项目使用了虚拟环境。
114 2
 python的virtualenv虚拟环境常见问题和命令
|
4月前
|
存储 Python
Python 中的局部变量和全局变量
【8月更文挑战第29天】
71 0
|
5月前
|
Python
Python中的全局变量和局部变量是什么?
在 Python 中, 全局变量与局部变量在作用域及访问权限上有着明显区别。全局变量在整个程序范围内均可访问, 如定义 `global_var` 并在函数 `func_using_global()` 内使用。局部变量仅在其定义的函数内有效, 如 `func_creating_local()` 中的 `local_var`, 在函数外访问会引发 `NameError`。
110 3
|
5月前
|
Python
Python代码优化避免全局变量
【7月更文挑战第22天】
70 2
|
5月前
|
Java C++ 开发者
python中常见问题
【7月更文挑战第12天】
85 10
|
5月前
|
存储 Java Linux
Python----全局变量、内存管理、数据类型
Python----全局变量、内存管理、数据类型
|
6月前
|
Python
Python中有效地使用global和globals()来管理全局变量
Python中有效地使用global和globals()来管理全局变量
100 1