作用域(scope)决定一个变量能在哪里被访问。理解作用域后,你会更容易看懂函数内部变量和外部变量之间的关系。
局部变量
定义在函数内部的变量称为局部变量(local variable)。它只能在函数内部访问。函数执行结束后,这些局部变量就会被销毁。函数参数也是函数内部的局部变量。
下面的 swap() 看起来交换了 a 和 b,但它交换的是自己的局部变量。可以把 main() 和 swap() 想成两个不同的房间:两个房间里都可以有叫 a 的盒子,但它们不是同一个盒子。
def swap(a, b):
a, b = b, a
print("函数内部:a = %d,b = %d" % (a, b))
def main():
a, b = 1, 2
print("交换前:a = %d,b = %d" % (a, b))
swap(a, b)
print("交换后:a = %d,b = %d" % (a, b))
if __name__ == "__main__":
main()运行结果:
交换前:a = 1,b = 2
函数内部:a = 2,b = 1
交换后:a = 1,b = 2互动实验
局部作用域与同名变量
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
调用 swap(a, b) 时,swap() 中的 a 和 main() 中的 a 是什么关系?
全局变量
定义在函数外部的变量称为全局变量(global variable)。全局变量的生命周期贯穿整个程序。
如果要在函数内部修改全局变量,需要使用 global 关键字(global keyword)声明。
a, b = 1, 2
def swap():
global a, b
a, b = b, a
print("函数内部:a = %d,b = %d" % (a, b))
def main():
print("交换前:a = %d,b = %d" % (a, b))
swap()
print("交换后:a = %d,b = %d" % (a, b))
if __name__ == "__main__":
main()运行结果:
交换前:a = 1,b = 2
函数内部:a = 2,b = 1
交换后:a = 2,b = 1全局变量不是不能用,但要谨慎。大量使用全局变量会让函数之间产生隐藏依赖,程序会更难排错。
知识测验
题目
在函数内部修改全局变量通常需要哪个关键字?
动手练习
维护一个全局分数板
在 add_points 中修改全局 score,再用同名局部参数体验遮蔽。
- 创建全局 score = 0。
- 在 add_points 中使用 global。
- 证明 preview_message(score) 不会修改全局值。