Python数据结构学习关键不在讲数而在实操:list的in操作为O(n)全扫描,10万元素最坏比较10万次;set查重O(1)但需构建开销,小列表偶尔查询未必划算。
这标题不是学习路线,是营销包装出来的数字幻觉。Python 数据结构的学习根本不存在“第515讲”这种线性序列,真正卡住人的从来不是讲数,而是
和
在什么场景下会意外变慢、
查重为什么有时不生效、
真比
快在哪——这些得靠实操暴露问题。
为什么
操作在
里慢得反直觉?
因为它是 O(n) 全扫描,哪怕只查一个元素,也要从头比到尾。你写
时,如果
有 10 万个元素,最坏情况要比较 10 万次。
换成
:查重是 O(1),但得先构建
,有额外开销
如果只是偶尔查一次,且列表很小(list反而更轻量
别对
反复做
——比如在循环里写
,这时务必把
转成
的键必须不可变,但
能当键,
不能——为什么?
因为
内部用哈希表实现,键的哈希值必须稳定。一旦
被修改,它的哈希值可能变化(实际会直接报错),导致字典内部索引失效。
内容不变 → 哈希值不变 → 可安全当键
里嵌了
也不行:
仍报错
想用可变结构当“逻辑键”?改用
或自定义
(慎用)
用
代替
做队列,真能提速吗?
只在频繁
或
时才明显快。因为
是双向链表+块内存混合实现,两端操作 O(1);而
在头部插入/删除是 O(n),要整体搬移后面所有元素。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
普通遍历、按索引取值(
):
更快,
是 O(n) 随机访问
只用
和
(尾部操作):两者性能几乎没差别,
更常用也更省内存
典型适用场景:BFS 层序遍历、滑动窗口、任务队列
真能省内存?什么情况下反而坏事?
能,尤其当你创建大量实例(比如百万级
对象)时,
禁用
,每个实例少存一个字典指针(约 24–48 字节),积少成多。
加了
后,实例不能动态加属性:
会报
继承时子类也得显式定义
,否则父类的
失效
用了
就别指望用
或
直接序列化,得手动处理
数据结构选型没有银弹,关键看你的数据规模、访问模式、是否需要动态扩展。跑个
比空想“该用哪个”有用十倍,而调试时打印
往往比文档更能说明问题。
listdictsetdequelistinlistif x in my_list:my_listsetset(my_list)listinfor item in big_list: if item in blacklist:blacklistsetdicttuplelistdictlistmy_dict = {}
my_dict[(1, 2)] = "valid" # OK
my_dict[[1, 2]] = "invalid" # TypeError: unhashable type: 'list'tupletuplelist(1, [2, 3])frozenset__hash__collections.dequelist.appendleft().popleft()dequelistmy_list[100]listdeque.append().pop()list__slots__Point(x, y)__slots____dict____slots__p.z = 10AttributeError__slots____slots____slots__vars(p)json.dumps(p)timeitsys.getsizeof()