Python 变量
变量是编程里最基础的概念——给数据"起个名字",方便后续使用。Python 的变量机制和 C/Java 有很大不同:不需要声明类型、赋值即定义,这一章我们彻底搞懂。
1. 什么是变量?
把变量想象成一个贴了标签的盒子,盒子里装数据,标签是名字。你想用数据,就喊标签名。
# 赋值即定义:不需要提前声明类型
name = "小明"
age = 20
height = 1.75
is_student = True
# 用 type() 查看变量的类型
print(type(name)) # <class 'str'>
print(type(age)) # <class 'int'>
print(type(height)) # <class 'float'>
print(type(is_student)) # <class 'bool'>
# 同一个变量可以反复赋不同类型的值(动态类型)
x = 100 # x 是 int
x = "hello" # 现在 x 是 str
x = [1, 2, 3] # 现在 x 是 list
print(type(x)) # <class 'list'>几个关键点:
- 赋值即定义:写
name = "小明"的瞬间,变量name就创建了,不需要提前"声明"。 - 动态类型:同一个变量可以反复赋不同类型的值——刚才存数字,现在存字符串,完全可以。这也是 Python 灵活的根源。
- 用
type()查类型:不确定变量是什么类型时,用type(变量)查看。
2. 命名规则
变量名不是随便起的,有硬性规则和软性约定:
- 硬规则:只能用字母、数字、下划线,不能以数字开头,不能是关键字(如
if、for、class),区分大小写。 - 软约定(PEP 8):用
snake_case(小写+下划线),如user_name、total_price。避免用拼音(nianling)或缩写到看不懂(a、b)。 - 见名知意:变量名应该能描述它存的内容。
age比a好,student_age在特定场景下更清晰。
3. 多重赋值与解包(超实用)
Python 在变量赋值上有一些非常优雅的写法,其他语言往往要写好几行:
# 1. 多重赋值:一行给多个变量赋不同的值
name, age, city = "小明", 20, "北京"
print(name, age, city) # 小明 20 北京
# 2. 链式赋值:多个变量赋同一个值
a = b = c = 0
print(a, b, c) # 0 0 0
# 3. 经典应用:一行交换两个变量的值(不需要中间变量)
a, b = 1, 2
a, b = b, a
print(a, b) # 2 1
# 4. 解包:把列表/元组的元素依次赋给变量
point = (3, 4, 5)
x, y, z = point
print(x, y, z) # 3 4 5
# 5. 用 * 收集多余元素
first, *rest = [1, 2, 3, 4, 5]
print(first) # 1
print(rest) # [2, 3, 4, 5]其中一行交换两个变量是经典 Python 写法。在 C/Java 里你需要写三行(借助临时变量),Python 一行搞定,而且可读性更好。
4. 全局变量与 local/global
变量有"作用域"——在哪里能访问它。函数内部定义的是局部变量,只在函数里有效;函数外部定义的是全局变量,所有地方都能读。
# 全局变量:在函数外定义
counter = 0
def increment():
# ⚠ 不加 global,Python 会创建一个局部变量
# 而不是修改全局 counter
global counter # 声明:我要用的是外面的 counter
counter += 1
increment()
increment()
increment()
print(counter) # 3
# 不推荐过度使用 global,大项目里会让代码难追踪
# 更好的做法是:用参数传入,用 return 返回注意陷阱:在函数内部给一个全局变量赋值,如果不写 global,Python 会以为你想新建一个同名的局部变量,全局变量并不会被修改。这是新手常踩的坑。
5. 作用域 LEGB 规则(进阶)
Python 查找一个变量名时,按 LEGB 顺序逐层找:
- L (Local):当前函数内部。
- E (Enclosing):外层嵌套函数(闭包场景)。
- G (Global):模块(文件)级别的全局变量。
- B (Built-in):Python 内置的名字(
print、len、int等)。
找到第一个就停止。所以不要用内置名字做变量名(如 list = [1,2]、str = "hi"),否则同名内置函数就被"覆盖",后面用不了了。
6. 常量约定
很多语言有 const 关键字定义常量,Python 没有。约定俗成的做法:用全大写+下划线的名字表示"不应被修改"的常量。
# Python 没有真正的"常量"语法
# 约定:全大写名字表示"不应被修改"的常量
MAX_SIZE = 100
PI = 3.14159
APP_NAME = "我的应用"
print(MAX_SIZE, PI, APP_NAME)
# 但 Python 不会阻止你修改它(只是约定)
MAX_SIZE = 200 # 语法上能跑,但你不应该这么做这只是社区约定——Python 不会真的阻止你修改 MAX_SIZE。这种"靠自律"的设计体现了 Python 的哲学:程序员是成年人,知道自己在干什么。
7. 删除变量 del
用 del 可以删除一个变量,让它"消失"。
name = "小明"
print(name) # 小明
# 用 del 删除变量,之后再用就报错
del name
# print(name) # ❌ NameError: name 'is not defined'实际开发中很少用到 del,理解即可。
8. 变量是"引用"(重要概念)
Python 变量存的是对象的引用(类似指针),不是对象本身。看这个经典例子:
a = [1, 2, 3]
b = a # b 和 a 指向同一个列表(不是复制)
b.append(4)
print(a) # [1, 2, 3, 4] <- a 也变了!
# 想要独立副本,用 copy
c = a.copy() # 或者 a[:]、list(a)
c.append(5)
print(a) # [1, 2, 3, 4] <- 这次 a 没变
print(c) # [1, 2, 3, 4, 5]这个知识点在处理列表、字典等"可变对象"时极其关键,后面讲列表时会再强调一遍。
小结
变量是给数据贴标签。Python 的变量动态类型(赋值即定义,类型随时变)、命名用 snake_case、作用域按 LEGB 查找、常量靠全大写约定。下一篇我们看 Python 的数据类型——整数、浮点、布尔到底有什么细节。
← 上一篇 Python 基础语法
下一篇 Python 数据类型 →