19.1 变量的作用域(掌握)
在编程中,作用域指的是变量可以被访问的范围。在 Python 中,变量的作用域分为局部作用域和全局作用域。
- 局部作用域(Local Scope):在函数内部定义的变量,只能在该函数内部使用,函数外部无法访问这些变量。
- 全局作用域(Global Scope):在整个程序中定义的变量,通常位于函数外部,可以在程序的任何位置访问。
19.2 局部变量(掌握)
局部变量是在函数内部定义的变量。它的作用范围仅限于该函数,函数外部无法访问这个变量。局部变量的生命周期在函数执行期间,当函数执行完毕,局部变量也随之销毁。
19.2.1 局部变量的定义和访问
- 定义:在函数内部直接赋值给变量即定义了局部变量。
- 访问:只能在定义它的函数内部访问。
示例:
def my_function(): local_var = 10 # 局部变量 print("局部变量:", local_var) my_function() # 输出: 局部变量: 10 # print(local_var) # 会引发 NameError,因为函数外无法访问 local_var
在上面的示例中,local_var
是 my_function()
函数内部的局部变量,它只能在该函数内部使用。函数外部无法访问 local_var
,否则会引发 NameError
。
19.2.2 局部变量的优先级
在函数内部,如果局部变量和全局变量同名,局部变量会优先被使用。局部变量的优先级高于同名的全局变量。
示例:
x = 5 # 全局变量 def my_function(): x = 10 # 局部变量 print("函数内部的 x:", x) # 输出: 函数内部的 x: 10 my_function() print("函数外部的 x:", x) # 输出: 函数外部的 x: 5
在这个示例中,虽然 x
在函数外部被定义为全局变量,但在 my_function()
中重新定义了一个同名的局部变量 x
,因此在函数内部会使用局部变量,而不会影响函数外部的全局变量。
19.3 全局变量(掌握)
全局变量是在函数外部定义的变量。全局变量可以在整个程序的任何地方访问,包括函数内部和外部。全局变量的生命周期贯穿程序的执行过程。
19.3.1 全局变量的定义和访问
- 定义:在函数外部直接赋值给变量。
- 访问:可以在函数内部和外部访问。
示例:
global_var = 20 # 全局变量 def my_function(): print("函数内部的全局变量:", global_var) my_function() # 输出: 函数内部的全局变量: 20 print("函数外部的全局变量:", global_var) # 输出: 函数外部的全局变量: 20
在这个示例中,global_var
是一个全局变量,既可以在 my_function()
函数内访问,也可以在函数外部访问。
19.3.2 使用 global
关键字修改全局变量
在函数内部,可以通过 global
关键字声明一个变量为全局变量,从而修改该全局变量的值。
示例:
count = 0 # 全局变量 def increment(): global count # 声明使用全局变量 count += 1 # 修改全局变量 increment() print("全局变量 count 的值:", count) # 输出: 全局变量 count 的值: 1
在这个示例中,通过 global count
声明 count
为全局变量,从而可以在 increment()
函数中修改 count
的值。
19.3.3 不使用 global
的情况下
如果没有使用 global
关键字直接在函数内部赋值同名变量,Python 会将该变量视为局部变量,不会影响同名的全局变量。
示例:
total = 100 # 全局变量 def reset_total(): total = 0 # 局部变量,不会影响全局的 total print("函数内部的 total:", total) # 输出: 函数内部的 total: 0 reset_total() print("全局的 total:", total) # 输出: 全局的 total: 100
在这个示例中,函数 reset_total()
中定义的 total
是一个局部变量,并不会影响函数外部的全局变量 total
。
19.4 全局变量和局部变量的注意事项(掌握)
- 避免过度使用全局变量:全局变量在程序的任何地方都可以被修改,可能会导致意外错误。通常建议使用局部变量,除非确有必要才使用全局变量。
global
的使用:如果需要在函数内部修改全局变量,必须使用global
关键字,否则 Python 会默认将其视为局部变量。- 变量的生命周期:全局变量在程序运行期间始终存在,而局部变量只在函数执行期间有效,函数执行结束后局部变量会被销毁。
- 命名冲突:避免在局部作用域中定义与全局变量同名的变量,以免造成混淆。
- 可读性问题:过多的全局变量会降低代码的可读性和可维护性,增加调试难度。
19.5 全局变量和局部变量的综合示例(掌握)
以下是一个综合示例,展示全局变量、局部变量和 global
关键字的使用场景。
示例:
balance = 1000 # 全局变量,初始余额 def deposit(amount): """存款操作""" global balance # 声明 balance 为全局变量 balance += amount # 修改全局变量 print(f"存款 {amount} 元,当前余额:{balance}") def withdraw(amount): """取款操作""" if amount > balance: print("余额不足") else: global balance balance -= amount print(f"取款 {amount} 元,当前余额:{balance}") def check_balance(): """查询余额""" print(f"当前余额为:{balance}") # 操作示例 deposit(500) # 存款 500 元 withdraw(200) # 取款 200 元 check_balance() # 查询余额
在这个示例中,balance
是一个全局变量,用于记录账户余额。deposit()
、withdraw()
和 check_balance()
是三个函数,分别用于存款、取款和查询余额。deposit()
和 withdraw()
函数通过 global
关键字来声明 balance
为全局变量,从而可以在函数内部修改全局变量 balance
的值。