15.变量的作用域

15.变量的作用域

欢迎来到《10天学会Python》第8天!今天学习变量的作用域——变量在哪些地方可以被访问和使用。

核心概念

作用域是变量的有效范围。理解作用域能帮你避免变量冲突,写出清晰的代码。

生活化比喻:房间规则

想象作用域像不同的房间:

  • 局部变量 = 卧室里的私人物品,只能在卧室内用
  • 全局变量 = 客厅里的公共物品,全家人都可以用
  • 不同作用域 = 卧室的钥匙不能打开书房的门

三条规则

  1. 变量在哪里定义,就在哪里有效 - 局部变量在函数外无法访问
  2. 内部可以访问外部,外部不能访问内部 - 函数内可以读全局变量,但不能直接修改
  3. 同名变量时,优先用当前作用域的 - 局部变量会"屏蔽"同名的全局变量

代码示例(5个生活场景)

示例1:局部变量(函数内部的私人空间)

python

def cook_meal():
    ingredients = ["鸡蛋", "番茄", "盐"]  # 局部变量
    print(f"准备:{ingredients}")
  
cook_meal()
# print(ingredients)  # 错误!外部不能访问局部变量

示例2:全局变量(全家共享的公共空间)

python

family_name = "张家"  # 全局变量
house_address = "幸福路123号"

def introduce_family():
    print(f"我们是{family_name},住在{house_address}")

introduce_family()
print(f"外部访问:{family_name}")  # 可以访问

示例3:global关键字(获得全局权限)

如果不声明global,函数内修改的是局部变量副本,不会影响全局变量:

python

family_budget = 10000

def spend_money(amount):
    global family_budget  # 声明要修改全局变量
    family_budget -= amount
    print(f"花费{amount}元,剩余:{family_budget}元")

spend_money(2000)  # 花费2000元,剩余:8000元

示例4:作用域链查找规则(从内到外搜索)

python

house_rule = "晚上10点前回家"  # 全局
shared_food = "苹果"

def living_room():
    shared_food = "香蕉"  # 中间层,屏蔽全局
  
    def bedroom():
        print(f"食物:{shared_food}")  # 找到中间层的"香蕉"
        print(f"家规:{house_rule}")   # 找到全局的
  
    bedroom()
    print(f"客厅食物:{shared_food}")  # 香蕉

living_room()
print(f"全局食物:{shared_food}")  # 苹果

示例5:避免命名冲突的最佳实践

python

# 全局变量用大写
GLOBAL_CONFIG = {"language": "zh"}

def load_config():
    local_config = GLOBAL_CONFIG.copy()  # 创建副本
    local_config["theme"] = "dark"
    return local_config

# 通过参数传递数据
def process_data(input_data, options=None):
    if options is None:
        options = {}
    return input_data.upper()

练习题

第1组(基础)

编写程序演示局部变量和全局变量的区别

python

school_name = "阳光小学"  # 全局

def show_class():
    class_name = "三年二班"  # 局部
    print(f"学校:{school_name},班级:{class_name}")

show_class()
# print(class_name)  # 应该出错
print(f"学校:{school_name}")

第2组(应用)

思考为什么应该尽量避免使用全局变量

python

user_count = 0  # 全局变量
user_list = []

def add_user(name):
    global user_count
    user_list.append(name)
    user_count += 1

# 问题:多个函数修改全局变量,容易出错,难以追踪
# 改进:使用类或函数封装数据

第3组(综合)

编写包含多个函数和变量作用域的程序

python

school_name = "编程学院"  # 全局

def enroll_student(name, grade):
    student_id = len(all_students) + 1001
    student_info = {"id": student_id, "name": name, "grade": grade}
  
    global all_students
    all_students.append(student_info)
    return student_id

def find_student(name):
    found_students = []
    for student in all_students:
        if student["name"] == name:
            found_students.append(student)
    return found_students

all_students = []  # 全局初始化

# 测试
id1 = enroll_student("小明", "三年级")
print(f"查找结果:{find_student('小明')}")
print(f"总人数:{len(all_students)}")

总结

今天学习了:

核心概念

  1. 局部变量:函数内部定义,函数内使用
  2. 全局变量:函数外部定义,整个程序可用
  3. global关键字:函数内修改全局变量需要声明

作用域规则

  1. 变量在哪里定义,就在哪里有效
  2. 内部可以访问外部,外部不能访问内部
  3. 同名变量优先用当前的

最佳实践

  1. 多用局部变量,少用全局变量
  2. 全局变量用大写或前缀明确标识
  3. 通过函数参数传递数据

理解作用域能让代码更清晰、易维护。明天学习模块导入与使用!


学习建议

  1. 练习时故意制造作用域错误,观察错误信息
  2. 思考什么时候适合用全局变量
  3. 注意变量命名和作用域的清晰划分
14.函数参数与返回值 2026-01-21
16.模块导入与使用 2026-01-21

评论区