当前位置:首页>python>Python 变量作用域 + 匿名函数 lambda 超详细教程

Python 变量作用域 + 匿名函数 lambda 超详细教程

  • 2026-09-02 18:53:33
Python 变量作用域 + 匿名函数 lambda 超详细教程

一、变量作用域(Scope)

变量的有效使用范围,在哪里能访问、在哪里不能访问,就是作用域。

Python 主要分两种:

  • • 局部变量(Local)
  • • 全局变量(Global)

二、局部变量

1. 定义

在函数内部定义的变量,叫局部变量。

2. 特点

  • • 只能在函数内部使用
  • • 函数执行结束,变量就销毁
  • • 外部无法访问
  • • 不同函数内可以有同名局部变量,互不干扰

3. 示例

deffunc():
    x = 10# 局部变量
print(x)  # 内部可以访问

func()       # 输出 10
print(x)     # 报错!外部不能访问

4. 不同函数同名局部变量互不影响

deff1():
    a = 100
print(a)

deff2():
    a = 200
print(a)

f1()   # 100
f2()   # 200

三、全局变量

1. 定义

在函数外部、整个文件顶层定义的变量,叫全局变量。

2. 特点

  • • 整个文件内都能访问
  • • 函数内部可以读取全局变量
  • • 函数内部不能直接修改全局变量(需要 global)

3. 示例:函数内读取全局变量

name = "小明"# 全局变量

deffunc():
print(name)  # 可以读

func()  # 小明

四、global 关键字(关键难点)

1. 作用

在函数内部声明要使用全局变量,这样就可以修改全局变量。

2. 语法

deffunc():
global 变量名
    变量名 = 新值

3. 示例:修改全局变量

count = 0

defadd():
global count    # 声明使用全局 count
    count += 1

add()
print(count)  # 1

4. 易错点:不写 global 会怎样?

会创建新的局部变量,而不是修改全局变量。

x = 100

deffunc():
    x = 200# 这是新的局部变量,和全局x无关
print(x)

func()   # 200
print(x) # 100(全局没变)

5. 先 global 再使用

不能先赋值再 global,会报错。

deffunc():
    x = 10
global x  # 报错

五、全局 vs 局部 总结表

类型
定义位置
访问范围
函数内能否修改
生命周期
局部变量
函数内部
仅函数内
随便改
函数结束销毁
全局变量
函数外部
整个文件
需用 global
程序运行全程

六、LEGB 规则(进阶,理解即可)

Python 查找变量的顺序:

  1. 1. Local 局部
  2. 2. Enclosing 外部嵌套函数(闭包)
  3. 3. Global 全局
  4. 4. Built-in 内置(如 print、sum)

找不到就报错:NameError


七、匿名函数 lambda

1. 什么是匿名函数?

  • • 没有名字的函数
  • • 一行写完简单逻辑
  • • 不用 def,用 lambda 关键字

2. 语法

lambda 参数1, 参数2, ...: 表达式

特点:

  • • 只能有一行表达式
  • • 自动 return 表达式结果
  • • 不能写循环、多行代码
  • • 常用于临时函数、作为参数传递

3. 最简单 lambda

f = lambda x: x + 1
print(f(5))   # 6

等价于:

deff(x):
return x + 1

4. 多个参数

add = lambda a, b: a + b
print(add(3, 4))  # 7

5. 带条件表达式(三元运算)

max_num = lambda a, b: a if a > b else b
print(max_num(10, 20))  # 20

6. 常用场景:配合高阶函数

lambda 最适合用在 sorted、map、filter 里。

示例1:列表按自定义规则排序

lst = [("apple", 5), ("banana", 2), ("orange", 3)]
lst.sort(key=lambda x: x[1])  # 按数字排序
print(lst)

示例2:map 映射

nums = [1,2,3]
res = list(map(lambda x: x*2, nums))
print(res)  # [2,4,6]

示例3:filter 过滤

nums = [1,2,3,4,5]
res = list(filter(lambda x: x%2==0, nums))
print(res)  # [2,4]

7. lambda 不能做什么

  • • 不能写 for / while 循环
  • • 不能写 if 缩进块,只能用三元表达式
  • • 不能赋值 a = 10
  • • 不适合复杂逻辑

八、经典易错点合集(新手必看)

易错1:函数内直接改全局变量报错

x = 10
deffunc():
    x += 1# 报错!不能直接修改

func()

解决:加 global x

易错2:局部变量和全局变量同名,容易混乱

x = 100
deffunc():
    x = 200
print(x)

func()   # 200(局部)
print(x) # 100(全局)

易错3:lambda 不能多行,不要强行写复杂逻辑

易错4:循环中使用 lambda 容易踩坑(延迟绑定)

了解即可,新手暂时不用深究。


📚 练习题(带答案讲解)

练习1

写出运行结果:

deff():
    a = 10

f()
print(a)

答案:报错 NameError
讲解:a 是局部变量,外部不能访问。


练习2

写出结果:

x = 5
deffunc():
global x
    x = 10

func()
print(x)

答案:10
讲解:global 声明后,修改的是全局变量。


练习3

用 lambda 写函数,返回两个数的乘积。

mul = lambda a,b: a*b
print(mul(3,4))  # 12

练习4

用 lambda 实现:传入一个数字,判断是否大于 10,返回 True/False。

is_big = lambda x: x > 10
print(is_big(15))  # True

📝 本章超级总结

变量作用域

  1. 1. 局部变量:函数内定义,只能内部用,函数结束销毁
  2. 2. 全局变量:外部定义,整个文件可用
  3. 3. 函数内只能读全局,要修改必须加 global
  4. 4. 同名局部变量会“遮挡”全局变量
  5. 5. 查找顺序:L → E → G → B

匿名函数 lambda

  1. 1. 一行函数,用于简单逻辑
  2. 2. 语法:lambda 参数: 表达式
  3. 3. 自动 return,不用写 return
  4. 4. 常用于 sorted / map / filter
  5. 5. 复杂逻辑不要用 lambda,用 def

最新文章

随机文章