跳到主要内容

5.3 变量作用域

作用域回答一个问题:一个变量,在哪些地方能用?

局部变量:函数内部的变量

在函数里面创建的变量,只在函数里面有效,函数一结束就销毁:

def calc():
result = 100 # 局部变量
print(result) # ✅ 函数内可以用

calc()
print(result) # ❌ NameError: name 'result' is not defined

不同函数的局部变量互不干扰,哪怕重名:

def func_a():
x = 1
print(x)

def func_b():
x = 999 # 和 func_a 的 x 毫无关系
print(x)

这是好事:写函数时不用担心变量名和别处冲突。

全局变量:函数外部的变量

在所有函数外面创建的变量是全局变量,任何函数里都能它:

site_name = "Python学习网" # 全局变量

def show_title():
print(f"欢迎来到{site_name}") # ✅ 函数内可以读全局变量

show_title()

坑:函数内不能直接"改"全局变量

在函数内给变量赋值,Python 会认为你在创建一个新的局部变量

count = 0

def add_count():
count = count + 1 # ❌ UnboundLocalError

add_count()

如果确实要在函数里修改全局变量,用 global 声明:

count = 0

def add_count():
global count # 声明:下面用的 count 是全局那个
count = count + 1

add_count()
add_count()
print(count) # 2

更好的做法:少用 global

到处用 global 修改全局变量,程序一大就没法知道变量是在哪被谁改的,非常难排查。推荐的风格是"参数进、返回值出"

# 不推荐:靠 global 沟通
count = 0
def add_count():
global count
count += 1

# 推荐:靠参数和返回值沟通
def add_count(count):
return count + 1

count = 0
count = add_count(count)
count = add_count(count)
print(count) # 2

练习

  1. 预测下面代码的输出,再运行验证:
x = 10

def change():
x = 20
print("函数内:", x)

change()
print("函数外:", x)
  1. 把上面代码改成使用 global,让函数外的打印结果变成 20。
点击查看答案
  1. 输出 函数内: 20函数外: 10。函数内的 x = 20 创建的是局部变量,不影响全局的 x。
# 2
x = 10

def change():
global x
x = 20
print("函数内:", x)

change()
print("函数外:", x) # 20

本章小结

  • 函数内创建的变量是局部的,外面用不了
  • 函数内可以读全局变量,但改它需要 global 声明
  • 好习惯:数据用参数传进去、用 return 传出来,少用 global

函数学完了!下一章学习如何使用别人写好的代码:6.1 模块