一、前言
"变量是什么?"
这是每个编程新手都会问的问题。
而在 Python 中,变量的概念既简单又微妙------它不像 C 或 Java 那样需要声明类型,却暗藏"对象引用"的玄机。
本文将带你: ✅ 理解 Python 变量的本质(不是"盒子",而是"标签")
✅ 掌握 6 大核心数据类型及其使用场景
✅ 区分"可变"与"不可变"对象,避免踩坑
✅ 用 id() 和 is 深入理解内存机制
✅ 养成良好的变量命名与使用习惯
二、变量:Python 中的"名字标签"
在 Python 中,变量不是存储数据的容器,而是指向对象的"标签"或"引用"。
对比传统语言(如 C):
- C:
int a = 10;→ 在内存中开辟一块叫a的空间存 10 - Python:
a = 10→ 创建一个整数对象10,然后让a指向它
python
a = 10
b = a
print(id(a), id(b)) # 输出相同内存地址!
✅ 关键理解 :
Python 的变量 = 名字 + 引用(指针),真正的数据是"对象"。
三、Python 六大核心数据类型
Python 是动态类型语言,变量无需声明类型,解释器自动推断。但对象本身有明确类型。
1. 数值类型(Numeric)
| 类型 | 示例 | 说明 |
|---|---|---|
int |
42, -7 |
任意精度整数 |
float |
3.14, -0.001 |
浮点数(双精度) |
complex |
3+4j |
复数(较少用) |
python
x = 100 # int
y = 3.14159 # float
z = 2 + 3j # complex
print(type(x)) # <class 'int'>
💡 注意:
10 / 3返回float(3.333...),10 // 3才是整除(3)
2. 字符串(str)------ 不可变序列
python
name = "Alice"
msg = 'Hello, World!'
long_text = """多行字符串
可包含换行"""
- 用单引号
'、双引号"或三引号"""定义 - 不可变:修改字符串会创建新对象
- 支持索引、切片、拼接
python
s = "Python"
print(s[0]) # 'P'
print(s[1:4]) # 'yth'
# s[0] = 'J' # ❌ 报错!str 不可变
3. 列表(list)------ 可变有序序列
python
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4]
mixed = [1, "hello", True, [1, 2]]
- 用方括号
[]定义 - 可变:可增删改元素
- 支持嵌套、切片、方法(
.append(),.pop()等)
python
fruits.append("orange")
fruits[0] = "pear" # ✅ 允许修改
4. 元组(tuple)------ 不可变有序序列
python
point = (10, 20)
rgb = (255, 128, 0)
single = (42,) # 单元素元组需加逗号!
- 用圆括号
()定义(实际靠逗号区分) - 不可变:一旦创建不能修改
- 常用于函数返回多个值、字典键(因不可变)
python
def get_name_age():
return "Bob", 25 # 实际返回 tuple
name, age = get_name_age()
5. 字典(dict)------ 键值对映射
python
person = {
"name": "Alice",
"age": 30,
"city": "Beijing"
}
- 用花括号
{}定义 - 可变
- 键必须是不可变类型(str, int, tuple),值可以是任意类型
python
person["email"] = "alice@example.com" # 新增
print(person["name"]) # 访问
6. 集合(set)------ 无序不重复元素集
python
unique_ids = {1, 2, 3, 3, 2} # 自动去重 → {1, 2, 3}
letters = set("hello") # {'h', 'e', 'l', 'o'}
- 用花括号
{}或set()创建 - 可变
- 支持数学运算:并集
|、交集&、差集-
python
a = {1, 2, 3}
b = {3, 4, 5}
print(a & b) # {3}
四、可变 vs 不可变对象:关键区别
| 类型 | 是否可变 | 常见代表 |
|---|---|---|
| 不可变 | ❌ 创建后不能修改 | int, float, str, tuple |
| 可变 | ✅ 可原地修改 | list, dict, set |
为什么重要?看这个经典例子:
python
# 不可变对象
a = 10
b = a
a = 20
print(b) # 10 → b 不受影响
# 可变对象
list1 = [1, 2, 3]
list2 = list1
list1.append(4)
print(list2) # [1, 2, 3, 4] → list2 被"意外"修改!
💡 解决方案:需要副本时,用
.copy()或copy.deepcopy()
python
list2 = list1.copy() # 浅拷贝
五、深入内存:id()、is 与 ==
id(obj):返回对象的内存地址is:比较两个变量是否指向同一个对象==:比较两个对象的值是否相等
python
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True(值相等)
print(a is b) # False(不同对象)
c = a
print(a is c) # True(同一对象)
⚠️ 特别注意小整数缓存:
python
x = 256
y = 256
print(x is y) # True(CPython 缓存 -5~256)
x = 257
y = 257
print(x is y) # 可能 False(取决于环境)
六、变量命名最佳实践
-
遵循 PEP8 :
snake_case(如user_name) -
见名知意 :避免
a,tmp,改用total_price,is_valid -
不要覆盖内置 :避免
list = [...]、str = "hello" -
类型提示(Python 3.5+) 提升可读性:
pythondef greet(name: str) -> str: return f"Hello, {name}!"
七、常见误区与避坑指南
❌ 误区 1:"变量有类型"
- 正确理解:对象有类型,变量只是引用
a = 10后a = "hello"完全合法
❌ 误区 2:"元组完全不可变"
-
元组本身不可变,但若包含可变对象,其内容可变:
pythont = ([1, 2], "hello") t[0].append(3) # ✅ 允许!t 变成 ([1,2,3], "hello")
❌ 误区 3:用 == 判断 None
-
正确做法:用
ispythonif value is None: # ✅ 推荐 if value == None: # ❌ 不推荐(可能被重载)
八、总结速查表
| 数据类型 | 符号 | 可变? | 有序? | 允许重复? | 典型用途 |
|---|---|---|---|---|---|
int/float |
--- | ❌ | --- | --- | 数值计算 |
str |
"..." |
❌ | ✅ | ✅ | 文本处理 |
list |
[...] |
✅ | ✅ | ✅ | 动态数组 |
tuple |
(...) |
❌ | ✅ | ✅ | 固定结构、返回值 |
dict |
{...} |
✅ | ✅(3.7+) | 键唯一 | 映射关系 |
set |
{...} |
✅ | ❌ | ❌ | 去重、集合运算 |
九、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!