Python 变量与数据类型
学习变量赋值、数字、字符串、布尔类型 · 难度:入门 · +10XP
Python 变量与数据类型 — 优雅简洁的数据管理
一、什么是 Python 变量?为什么它如此优雅?
在 Python 中,变量可以理解为一个名字标签(Name Tag),它贴在内存中的某个对象上。与 JavaScript 不同,Python 是强类型、动态类型语言:强类型意味着不同类型之间不会隐式转换("5" + 5 会报错),动态类型意味着变量可以随时指向不同类型的对象,无需事先声明类型。
为什么 Python 的变量设计重要?Python 的设计哲学是"简单优于复杂,明了优于隐晦"。它的变量系统让初学者能快速上手,同时又有足够深度支撑大型项目的开发。理解 Python 的可变(mutable)与不可变(immutable)对象概念,是写出正确、高效 Python 代码的关键。
Python 中一切皆对象:整数、字符串、函数、类,甚至是模块本身,都是对象。每个对象都有三个要素:标识(id)、类型(type)、值(value)。
二、Python 核心数据类型全景图
| 分类 | 类型 | 可变性 | 示例 |
|---|---|---|---|
| 数字类型 | int(整数) | 不可变 | 42、-7、0b1010(二进制) |
| float(浮点数) | 不可变 | 3.14、-0.5、1.2e5(科学计数) | |
| complex(复数) | 不可变 | 1+2j、3-4j | |
| 文本类型 | str(字符串) | 不可变 | "hello"、'Python'、"""多行""" |
| bytes(字节串) | 不可变 | b"hello" | |
| 布尔类型 | bool | 不可变 | True、False(注意首字母大写!) |
| 空类型 | NoneType | 不可变(单例) | None(等价于 null) |
| 容器类型 | list(列表) | 可变 | [1, 2, 3]、["a", "b"] |
| tuple(元组) | 不可变 | (1, 2)、("x",) | |
| dict(字典) | 可变 | {"key": "value"} | |
| set(集合) | 可变 | {1, 2, 3} |
三、可变 vs 不可变对象 — 必须理解的核心概念
| 对比维度 | 不可变对象 | 可变对象 |
|---|---|---|
| 类型 | int, float, str, tuple, bool, None | list, dict, set, 自定义对象 |
| 能否修改内容 | 不能。任何"修改"都是创建新对象 | 能。内容可以被原地修改 |
| 作为函数参数 | 传递值(函数内修改不影响外部) | 传递引用(函数内修改会影响外部!) |
| 可作为字典的键 | 可以(因为 hash 值不变) | 不可以(hash 值可能变化) |
| 内存效率 | 可能产生更多临时对象 | 更节省内存 |
四、详细代码示例(逐行注释)
# ======== 1. 变量赋值 — 无需声明类型 ========
name = "小明" # 字符串(str),自动推断类型
age = 18 # 整数(int)
height = 1.75 # 浮点数(float)
is_student = True # 布尔值(bool),注意大写 T 和 F
hobbies = ["篮球", "编程", "阅读"] # 列表(list)
profile = {"name": "小明", "age": 18} # 字典(dict)
# 变量可以随时改变类型(动态类型)
x = 42 # x 是 int
x = "hello" # 现在 x 是 str(完全合法)
# ======== 2. 类型检查和转换 ========
print(type(age)) # — 查看类型
print(isinstance(age, int)) # True — 判断是否为某类型
# 类型转换(显式转换,不会隐式发生)
num_str = "123"
num_int = int(num_str) # 字符串 → 整数:123
num_float = float("3.14")# 字符串 → 浮点数:3.14
str_num = str(42) # 整数 → 字符串:"42"
bool_val = bool(1) # → True(0、空容器、None 为 False)
# ======== 3. 字符串操作 ========
s = "Python编程"
print(len(s)) # 7 — 字符串长度
print(s[0]) # 'P' — 索引(从 0 开始)
print(s[-1]) # '程' — 负数索引从末尾开始
print(s[0:6]) # 'Python' — 切片 [开始:结束:步长]
print(s.upper()) # 'PYTHON编程' — 转大写
print(s.replace("Python", "Java")) # 'Java编程' — 替换
# f-string(Python 3.6+,最推荐)
print(f"我叫{name},今年{age}岁") # 嵌入变量,简洁清晰
# ======== 4. 数字运算 ========
a, b = 10, 3
print(a + b) # 13 — 加法
print(a - b) # 7 — 减法
print(a * b) # 30 — 乘法
print(a / b) # 3.3333... — 除法(总是返回 float)
print(a // b) # 3 — 整除(向下取整)
print(a % b) # 1 — 取余
print(a ** b) # 1000 — 幂运算(10 的 3 次方)
# ======== 5. 可变对象 vs 不可变对象(重要!) ========
# 不可变对象 — str
text = "hello"
text2 = text
text = text + " world" # 创建新字符串,text 指向新对象
print(text2) # 输出 "hello"(未受影响!)
# 可变对象 — list
list1 = [1, 2, 3]
list2 = list1 # list2 指向同一对象(不是复制!)
list1.append(4) # 原地修改
print(list2) # 输出 [1, 2, 3, 4](也变了!)
# 正确复制列表的方式:
list3 = list1.copy() # 或 list1[:] 或 list(list1)
# ======== 6. 多重赋值与交换(Python 特色) ========
a, b, c = 1, 2, 3 # 同时赋值三个变量
a, b = b, a # 一行交换两个变量的值(无需临时变量!)
print(a, b) # 输出:2 1
# 解包(unpacking)
data = ("小明", 18, "北京")
name, age, city = data # 同时解包到三个变量
# ======== 7. None 的使用 ========
result = None # 表示"尚无值"
if result is None: # 判断 None 必须用 is,不能用 ==
print("暂无结果")
# None 是单例,is 比较的是身份,比 == 更准确
# ======== 8. 全局变量与局部变量 ========
count = 0 # 全局变量
def increment():
global count # 在函数内修改全局变量需要 global 声明
count += 1
local_var = 10 # 局部变量,只在函数内可见
五、Python vs JavaScript 变量对比
| 特性 | Python | JavaScript |
|---|---|---|
| 声明方式 | 直接赋值,无需关键字 | var / let / const |
| 类型系统 | 强类型(不会隐式转换) | 弱类型(会隐式类型转换) |
| "5" + 5 结果 | TypeError(报错) | "55"(字符串拼接) |
| 布尔值 | True / False(大写) | true / false(小写) |
| 空值 | None | null / undefined |
| 常量 | 约定大写(非强制) | const(强制不可变) |
| 变量提升 | 无 | 有(var) |
六、实践任务
- 创建变量存储你的姓名、年龄、城市,使用 f-string 输出一句完整的自我介绍
- 编写一个程序,交换两个变量的值(使用 Python 的一行交换语法)
- 创建一个列表
[1, 2, 3],将它赋值给另一个变量,然后修改原列表,观察两个变量是否都变了,理解可变对象 - 使用
type()和isinstance()检查各种类型 - 尝试将字符串
"abc"和数字123直接相加,观察报错信息,然后用str()正确转换后再拼接