欢迎来到《10天学会Python》第8天!今天学习变量的作用域——变量在哪些地方可以被访问和使用。
核心概念
作用域是变量的有效范围。理解作用域能帮你避免变量冲突,写出清晰的代码。
生活化比喻:房间规则
想象作用域像不同的房间:
- 局部变量 = 卧室里的私人物品,只能在卧室内用
- 全局变量 = 客厅里的公共物品,全家人都可以用
- 不同作用域 = 卧室的钥匙不能打开书房的门
三条规则:
- 变量在哪里定义,就在哪里有效 - 局部变量在函数外无法访问
- 内部可以访问外部,外部不能访问内部 - 函数内可以读全局变量,但不能直接修改
- 同名变量时,优先用当前作用域的 - 局部变量会"屏蔽"同名的全局变量
代码示例(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)}")
总结
今天学习了:
核心概念:
- 局部变量:函数内部定义,函数内使用
- 全局变量:函数外部定义,整个程序可用
- global关键字:函数内修改全局变量需要声明
作用域规则:
- 变量在哪里定义,就在哪里有效
- 内部可以访问外部,外部不能访问内部
- 同名变量优先用当前的
最佳实践:
- 多用局部变量,少用全局变量
- 全局变量用大写或前缀明确标识
- 通过函数参数传递数据
理解作用域能让代码更清晰、易维护。明天学习模块导入与使用!
学习建议:
- 练习时故意制造作用域错误,观察错误信息
- 思考什么时候适合用全局变量
- 注意变量命名和作用域的清晰划分