类型与数据结构
tuples、sets、typing、type-annot、variables-and-data-types。
30 分钟
内置类型与内存模型
在 python-fundamentals 里你已用过 list、dict、set;本课深入可变/不可变、引用语义、拷贝与性能,这是写出正确并发代码与高效算法的前提。路线图节点见 /roadmaps/python;AI 数据处理常涉及大量容器操作,可与 ai-agents-essentials 并行。
学习目标
- 区分可变对象与不可变对象及其赋值行为
- 正确使用浅拷贝、深拷贝与
copy模块 - 理解 dict/set 的哈希要求与常见性能陷阱
可变 vs 不可变
# 不可变:int, float, str, tuple, frozenset, bytes
a = "hello"
b = a
b = b + " world" # 创建新 str,a 不变
# 可变:list, dict, set, bytearray
xs = [1, 2, 3]
ys = xs
ys.append(4) # xs 也变成 [1, 2, 3, 4]
函数默认参数的可变陷阱:
def add_item(item, bucket=[]): # 危险:共享同一 list
bucket.append(item)
return bucket
# 正确写法
def add_item_safe(item, bucket=None):
if bucket is None:
bucket = []
bucket.append(item)
return bucket
拷贝
import copy
original = {"tags": ["python", "async"], "meta": {"level": "advanced"}}
shallow = copy.copy(original)
deep = copy.deepcopy(original)
shallow["tags"].append("typing") # original["tags"] 也会变
deep["meta"]["level"] = "expert" # original 不受影响
dict 与 set 的哈希
键必须是可哈希的(不可变且实现 __hash__):
# OK
registry = {("pya-types", 1): "lesson"}
# TypeError: unhashable type 'list'
# bad = {[1, 2]: "value"}
练习
- 写一段代码演示
is与==在 small int 与 list 上的差异 - 用
timeit比较 list 推导与 for 循环构建 1e5 元素列表的耗时 - 解释为何 dict 键不能是 list
小结
Python 变量是引用,不是盒子。 掌握可变性与拷贝,才能避免隐蔽 bug,并为 OOP 与 async 共享状态问题做好准备。
加载本节练习…