Python列表进阶指南:从内存模型到高阶操作与性能优化
1. 从“容器”到“瑞士军刀”重新认识Python列表如果你刚开始学Python或者已经写了几个月代码那么“列表”这个概念对你来说可能就是一个用来装东西的“盒子”。老师或者教程会告诉你列表用方括号[]表示里面可以放数字、字符串甚至其他列表。这没错但如果你对列表的理解就止步于此那就像只把瑞士军刀当成一个开瓶器——你只用了它1%的功能却错过了99%的便利与强大。我见过太多新手甚至一些有经验的开发者在处理数据时第一反应是写循环。遍历、判断、累加……代码写了一大堆既啰嗦又容易出错。而Python列表配合其内置的“魔法方法”和一系列高效的操作本质上是一个高度优化、功能丰富的动态数组。它不仅仅是存储数据的容器更是你进行数据清洗、转换、筛选和分析的“第一生产力工具”。今天我们就抛开那些教科书式的定义从一个实践者的角度彻底拆解Python列表。我会带你看看这个看似简单的数据结构如何在真实的代码场景中扮演着“多面手”的角色以及如何避开那些教科书里不会写的“坑”。2. 列表的“里子”不止是动态数组那么简单当我们写下my_list [1, 2, 3]时Python解释器在背后做的事情远比想象中复杂。它并不是在内存中简单地开辟三个连续格子。理解这一点是高效使用列表的关键。2.1 内存模型与动态扩容机制Python的列表对象本身是一个独立的结构体它包含多个字段其中最关键的是一个指向元素数组的指针、列表当前长度len以及列表的分配容量allocated。初始时如果你创建了一个包含3个元素的列表Python可能会分配一个能容纳4个或更多元素的底层数组空间。这个多出来的空间就是为后续的append操作预留的。当你调用my_list.append(4)时解释器会检查剩余空间。如果够就直接在下一个空闲位置写入新元素并更新长度字段时间复杂度是O(1)非常快。如果剩余空间不足了呢这就是“动态扩容”发生的时候。解释器会申请一块更大的新内存通常是当前容量的约1.125倍但这个增长因子在不同Python版本和实现中可能不同然后将旧数组中的所有元素依次拷贝到新数组中最后释放旧内存。这个操作的时间复杂度是O(n)。因此虽然单次append的均摊时间复杂度仍是O(1)但如果你能预知列表的大致规模在创建时就直接指定可以避免多次扩容带来的性能损耗。# 低效做法反复扩容 data [] for i in range(1000000): data.append(i) # 可能会触发多次内存重新分配和拷贝 # 高效做法预分配通过列表推导式间接实现 data [0] * 1000000 # 一次性分配好空间 for i in range(1000000): data[i] i # 直接按索引赋值无扩容开销 # 或者如果你不知道具体值但知道大小可以这样虽然不常见 from array import array # array类型更接近底层数组但元素类型必须一致 int_array array(i, [0]) * 1000000注意[0] * n这种方式创建的是包含n个对同一个对象0的引用的列表。由于整数0在Python中是不可变对象且会被小整数池缓存所以没问题。但如果用来创建包含可变对象如空列表[]的列表就会导致灾难——所有元素都是对同一个列表的引用。这时应该用列表推导式[[] for _ in range(n)]。2.2 引用语义列表里装的都是“地址”这是Python列表乃至所有容器类型最核心、也最容易让人犯错的概念。列表存储的不是对象本身而是对象的引用可以粗略理解为内存地址。这带来了极大的灵活性也埋下了一些陷阱。a [1, 2, [3, 4]] # 第三个元素是一个列表对象的引用 b a # 这不是拷贝b和a现在指向同一个列表对象。 b[0] 99 print(a) # 输出[99, 2, [3, 4]]a也被修改了 # 浅拷贝 (Shallow Copy)只拷贝最外层引用 import copy c a.copy() # 或 c a[:] 或 c list(a) c[0] 100 print(a) # 输出[99, 2, [3, 4]]a[0]没变好。 c[2].append(5) print(a) # 输出[99, 2, [3, 4, 5]]糟了a[2]也被修改了 # 因为c[2]和a[2]引用的是同一个内层列表对象。 # 深拷贝 (Deep Copy)递归拷贝所有层级的对象 d copy.deepcopy(a) d[2].append(6) print(a) # 输出[99, 2, [3, 4, 5]]a完全不受影响。 print(d) # 输出[99, 2, [3, 4, 5, 6]]在实际项目中尤其是涉及配置传递、缓存数据时如果不清楚引用和拷贝的区别很容易产生难以追踪的Bug。我的经验法则是除非你明确需要共享数据否则在需要修改传入的列表参数时先做拷贝在返回一个内部列表时考虑返回它的拷贝以避免调用方意外修改你的内部状态。3. 列表推导式与生成器表达式优雅与效率的平衡列表推导式List Comprehension是Python的语法糖也是将“命令式”循环转化为“声明式”表达的典范。它不仅仅是为了代码更简洁在解释器层面它通常比等效的for循环append操作更快因为迭代逻辑是在C语言层面实现的减少了Python字节码的执行和中间变量的创建。3.1 基础与多层嵌套# 传统循环 squares [] for x in range(10): squares.append(x**2) # 列表推导式 squares [x**2 for x in range(10)] # 带条件的筛选 even_squares [x**2 for x in range(10) if x % 2 0] # 嵌套循环相当于笛卡尔积 pairs [(x, y) for x in range(3) for y in [a, b, c]] # 输出[(0, a), (0, b), (0, c), (1, a), ...]但是列表推导式会立即生成一个完整的列表并占用相应的内存。当处理的数据量非常大比如上百万条记录或者你只需要迭代一次时使用列表推导式可能会消耗大量不必要的内存。这时就该生成器表达式Generator Expression登场了。3.2 生成器表达式惰性求值的利器生成器表达式语法和列表推导式几乎一样只是把方括号[]换成圆括号()。它返回一个生成器对象这个对象在迭代时才会逐个产生元素而不是一次性生成所有元素。# 列表推导式立即占用大量内存 big_list [x**2 for x in range(1000000)] # 内存中立刻有了100万个整数 # 生成器表达式几乎不占内存只占生成器对象本身很小的开销 big_gen (x**2 for x in range(1000000)) # 你可以像迭代列表一样迭代它 for value in big_gen: if value 100: break # 处理value # 注意生成器只能迭代一次。迭代完后big_gen就空了。 # 一个经典用例求一个大文件的行数 # 假设文件非常大无法全部读入内存 line_count sum(1 for line in open(huge_file.txt)) # 使用生成器表达式内存友好何时用列表推导式何时用生成器表达式我的判断标准是需要重复访问结果用列表推导式。因为生成器只能迭代一次。数据量小或中等用列表推导式。代码更清晰且小数据量下性能差异可忽略。数据量巨大且只需单次顺序访问用生成器表达式。这是拯救内存的利器。需要将结果传递给一个立即消费它的函数如sum(),max(),join()用生成器表达式。sum(x**2 for x in range(10))比sum([x**2 for x in range(10)])更高效。4. 列表的“高阶”操作排序、切片与拆包掌握了创建和基本增删改查列表的威力才发挥了一半。排序、切片和拆包这三个特性能让你用极简的代码完成复杂的操作。4.1 排序的两种方式sort()与sorted()这是一个老生常谈但至关重要的问题。list.sort()是原地排序它会直接修改原列表返回None。而sorted()是返回新列表原列表保持不变。my_list [3, 1, 4, 1, 5, 9, 2] # 方式一原地排序 my_list.sort() # my_list 现在是 [1, 1, 2, 3, 4, 5, 9] # 注意my_list.sort() 的返回值是 None不要写成 a my_list.sort()。 # 方式二返回新列表 new_list sorted(my_list) # my_list 不变new_list 是排序后的新列表两者都支持两个强大的参数key和reverse。reverseTrue降序排序。key一个函数用于从每个元素中提取比较键。这是排序的灵魂。students [ {name: Alice, grade: 85}, {name: Bob, grade: 92}, {name: Charlie, grade: 78} ] # 按成绩升序排序 students_by_grade sorted(students, keylambda s: s[grade]) # 按成绩降序排序 students_by_grade_desc sorted(students, keylambda s: s[grade], reverseTrue) # 更复杂的key先按成绩降序成绩相同按名字升序 # 技巧key函数可以返回一个元组元组内按优先级比较 students.sort(keylambda s: (-s[grade], s[name]))实操心得对于自定义的类对象排序除了定义__lt__等魔法方法更常用的做法是使用key参数或者使用functools.cmp_to_key函数将老式的比较函数转换。key函数因为只需要对每个元素计算一次键值并缓存通常比cmp函数效率更高。4.2 切片操作不只是截取切片语法list[start:stop:step]强大到令人发指。start包含stop不包含step是步长。nums [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 基本截取 print(nums[2:5]) # [2, 3, 4] print(nums[:3]) # [0, 1, 2] start默认为0 print(nums[7:]) # [7, 8, 9] stop默认为末尾 print(nums[:]) # 完整切片是创建列表浅拷贝的常用方法 # 步长 print(nums[::2]) # [0, 2, 4, 6, 8] 每隔一个取一个 print(nums[1::2]) # [1, 3, 5, 7, 9] # 负索引和负步长 print(nums[-3:]) # [7, 8, 9] 倒数三个 print(nums[:-3]) # [0, 1, 2, 3, 4, 5, 6] 除了倒数三个 print(nums[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 经典反转列表 print(nums[5:2:-1]) # [5, 4, 3] 反向切片切片操作同样适用于字符串、元组等序列类型。它的一大优点是返回新的列表不会修改原列表。但请注意对于包含可变对象的列表切片是浅拷贝。4.3 可迭代对象拆包让赋值和函数调用更清晰拆包Unpacking允许你将一个可迭代对象如列表、元组的元素直接赋值给多个变量。# 基本拆包 point [10, 20] x, y point # x10, y20 # 交换两个变量无需临时变量 a, b b, a # 使用星号(*)处理剩余元素 first, *middle, last [1, 2, 3, 4, 5] # first1, middle[2,3,4], last5 # 在函数调用中的应用 def draw_line(x1, y1, x2, y2): pass points [0, 0, 100, 100] draw_line(*points) # 等价于 draw_line(0, 0, 100, 100) # 合并列表 list_a [1, 2, 3] list_b [4, 5, 6] merged [*list_a, *list_b] # [1, 2, 3, 4, 5, 6]比 list_a list_b 更直观拆包语法极大地提高了代码的可读性尤其是在处理函数返回多个值或者操作固定格式的数据行时。5. 性能陷阱与最佳实践列表用起来爽但用不好就是性能杀手。下面这些坑我几乎都踩过。5.1 不要在循环中检查元素是否存在针对大规模列表判断一个元素是否在列表中使用in操作符。但它的时间复杂度是O(n)因为它需要遍历整个列表。如果这个检查在一个循环内部就会变成O(n²)的灾难。# 糟糕的做法O(n²) my_list [ ... ] # 一个很大的列表 for item in data_stream: if item in my_list: # 每次都是O(n)的遍历 process(item) # 改进的做法使用集合(set)in操作是O(1) my_set set(my_list) # 一次性O(n)转换 for item in data_stream: if item in my_set: # 每次都是O(1) process(item)当然前提是你的元素是可哈希的数字、字符串、元组等并且你不需要保持元素的顺序或允许重复。如果只是做存在性检查集合是完美的选择。5.2 谨慎使用list.insert(0, item)和list.pop(0)在列表开头插入或删除元素时间复杂度是O(n)因为需要将所有后续元素向后移动或向前移动。这是一个非常隐蔽的性能瓶颈。# 模拟一个队列先进先出 queue [] # 入队 - 低效做法 queue.insert(0, task1) # O(n) queue.insert(0, task2) # O(n) # 出队 - 低效做法 task queue.pop(0) # O(n) # 高效做法使用 collections.deque from collections import deque queue deque() queue.append(task1) # 右端入队O(1) queue.append(task2) # O(1) task queue.popleft() # 左端出队O(1)deque双端队列在两端进行添加和删除操作都是O(1)是替代列表作为队列或栈的理想数据结构。同理如果你需要在中间频繁插入删除可以考虑bisect模块维护有序列表或者使用链表结构虽然Python标准库没有内置链表但可以用collections.deque模拟或使用第三方库。5.3 字符串拼接别再用了这是一个经典问题。字符串是不可变对象每次用拼接都会创建一个新的字符串对象并复制旧内容时间复杂度是O(n²)。# 低效做法 pieces [very] * 1000000 s for piece in pieces: s piece # 每次循环都创建新字符串大量拷贝 # 高效做法一使用 str.join() s .join(pieces) # 一次性计算总长度分配内存然后拼接 # 高效做法二使用 io.StringIO适用于复杂构建 from io import StringIO buffer StringIO() for piece in pieces: buffer.write(piece) s buffer.getvalue()对于列表虽然即extend是原地操作效率尚可但str.join()依然是拼接字符串列表的最佳实践因为它语义清晰且性能最优。6. 列表与其他数据结构的协作列表很少单独作战。理解它如何与Python生态中的其他工具配合才能解决真正复杂的问题。6.1 与zip和enumerate共舞zip用于将多个可迭代对象“压缩”成一个个元组enumerate用于在迭代时获取索引和值。它们返回的都是迭代器常与列表推导式结合使用。names [Alice, Bob, Charlie] scores [85, 92, 78] # 将两个列表合并成字典 score_dict dict(zip(names, scores)) # {Alice: 85, Bob: 92, Charlie: 78} # 同时处理索引和值 for idx, name in enumerate(names, start1): # start参数指定起始索引 print(fRank {idx}: {name}) # 用列表推导式创建带索引的元组列表 indexed_names [(i, name) for i, name in enumerate(names)]6.2 使用filter和map进行函数式处理filter(func, iterable)和map(func, iterable)是函数式编程的工具。它们返回迭代器可以惰性求值。nums range(10) # 使用map进行转换 squares list(map(lambda x: x**2, nums)) # 等价于 [x**2 for x in nums] # 使用filter进行筛选 evens list(filter(lambda x: x % 2 0, nums)) # 等价于 [x for x in nums if x % 2 0]在现代Python中列表推导式和生成器表达式在大多数场景下可读性更高也更“Pythonic”。但map和filter在与内置函数如int,str结合或者需要将函数作为参数传递时仍有其用武之地。6.3 利用itertools模块处理复杂迭代标准库的itertools模块提供了大量用于操作迭代器的工具函数很多都可以用来生成或处理列表。import itertools # 无限迭代器 counter itertools.count(start10, step2) # 10, 12, 14, ... first_three list(itertools.islice(counter, 3)) # [10, 12, 14] # 排列组合 letters [A, B, C] perms list(itertools.permutations(letters, 2)) # 排列: [(A,B), (A,C), ...] combs list(itertools.combinations(letters, 2)) # 组合: [(A,B), (A,C), (B,C)] # 扁平化处理嵌套列表仅限一层 nested [[1,2], [3,4], [5]] flattened list(itertools.chain.from_iterable(nested)) # [1, 2, 3, 4, 5] # 对于多层嵌套需要递归或使用其他方法。7. 真实场景下的列表模式与技巧最后分享几个我在实际项目中反复使用的列表相关模式和技巧它们能帮你写出更干净、更健壮的代码。7.1 使用“哨兵值”或next进行查找查找列表中第一个满足条件的元素通常我们会写循环。但使用next配合生成器表达式可以一行搞定并且能在找不到时提供默认值。users [ {name: Alice, active: False}, {name: Bob, active: True}, {name: Charlie, active: True} ] # 传统做法 first_active None for user in users: if user[active]: first_active user break # 更优雅的做法 first_active next((user for user in users if user[active]), None) # next第一个参数是迭代器第二个参数是默认值找不到时返回 print(first_active[name]) # Bob # 如果确定至少有一个可以不加默认值但找不到会抛出StopIteration # first_active next(user for user in users if user[active])7.2 用bisect管理有序列表当你需要维护一个始终有序的列表并频繁进行插入和查找时标准库的bisect模块是你的最佳选择。它使用二分查找算法时间复杂度为O(log n)。import bisect # 保持列表有序插入 sorted_scores [10, 20, 30, 40, 50] new_score 25 bisect.insort(sorted_scores, new_score) # 列表变为 [10, 20, 25, 30, 40, 50] # 查找插入位置不实际插入 index bisect.bisect_left(sorted_scores, 25) # 返回 2 # bisect_left 返回插入点以保持顺序如果有相等元素插在左边。 # bisect_right (或 bisect) 则插在右边。 # 应用场景按分数段划分等级 breakpoints [60, 70, 80, 90] grades FDCBA score 85 grade_index bisect.bisect_left(breakpoints, score) # score85, breakpoints[2]80, 返回3 grade grades[grade_index] # B7.3 列表作为栈和队列的误区我们之前提到了用deque做队列。列表本身非常适合作为栈后进先出使用因为append()和pop()都是在列表末尾操作时间复杂度是O(1)。stack [] stack.append(task1) # 入栈 stack.append(task2) task stack.pop() # 出栈得到task2 # stack.pop(0) 是错的那是队列操作且效率低。记住这个简单的口诀列表尾作栈deque两端作队列。这能避免大多数因误用数据结构导致的性能问题。列表是Python的基石它的简单掩盖了其设计的精妙和内涵的丰富。从内存模型到高阶用法从性能陷阱到最佳实践理解每一个细节都能让你在编码时多一份从容少一个Bug。真正掌握列表不是记住它的所有方法而是懂得在何种场景下选择最契合的那种用法。

相关新闻

一文跑通SMPL-X人体模型:0基础从安装到生成第一张三维网格

一文跑通SMPL-X人体模型:0基础从安装到生成第一张三维网格

一文跑通SMPL-X人体模型:0基础从安装到生成第一张三维网格 【免费下载链接】smplx SMPL-X 项目地址: https://gitcode.com/gh_mirrors/smp/smplx SMPL-X 是目前人体三维建模领域非常受欢迎的开源项目,它用一个统一模型同时描述人体姿态、身体形状…

2026/10/9 17:33:16 阅读更多 →
macOS免费录屏软件QuickRecorder完整指南:开源录屏工具的安装、配置与进阶技巧

macOS免费录屏软件QuickRecorder完整指南:开源录屏工具的安装、配置与进阶技巧

macOS免费录屏软件QuickRecorder完整指南:开源录屏工具的安装、配置与进阶技巧 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https:/…

2026/10/3 8:43:37 阅读更多 →
多智能体博弈:从博弈论基础到强化学习实战

多智能体博弈:从博弈论基础到强化学习实战

1. 项目概述:从单打独斗到群雄逐鹿 最近在整理多智能体系统相关的学习笔记,特别是其中博弈论的部分,感触颇深。过去我们研究强化学习,很多时候是让一个智能体在环境里“单打独斗”,比如训练一个机械臂抓取物体&#xf…

2026/10/15 23:00:23 阅读更多 →

最新新闻

Claude代码模板:开箱即用的AI编程脚手架

Claude代码模板:开箱即用的AI编程脚手架

1. 这不是另一个“Claude CLI”:为什么 claude-code-templates 是开发者真正需要的脚手架 你有没有过这样的经历:刚想用 Claude 写一段 Python 数据清洗脚本,打开编辑器,光是搭环境就花了二十分钟——先查 pip install 还是 …

2026/10/17 5:27:25 阅读更多 →
H5扫码开发实战:jsQR与html5-qrcode选型、参数调优与避坑指南

H5扫码开发实战:jsQR与html5-qrcode选型、参数调优与避坑指南

简介:这是一份面向前端与跨端开发者的H5扫码功能实现资源,围绕jsQR与html5-qrcode两个JavaScript库展开,解决浏览器端无需安装插件即可读取二维码的问题,并兼顾uni-app在H5环境下的集成需求。资源包共43个文件,约488KB…

2026/10/17 5:27:25 阅读更多 →
WinDbg分析dump文件实战:从崩溃定位到托管内存排查

WinDbg分析dump文件实战:从崩溃定位到托管内存排查

前两天线上有个服务突然内存暴涨,同事用任务管理器抓了一个内存转储扔给我,丢下一句“帮我看看是不是泄漏”。我打开WinDbg加载这个.dmp文件,先敲了一条!analyze -v,然后盯着输出的栈回溯看了五分钟,发现根本不是托管内…

2026/10/17 5:27:25 阅读更多 →
JMX未授权访问漏洞自查与修复:四层防线加固指南

JMX未授权访问漏洞自查与修复:四层防线加固指南

Java的JMX(Java Management Extensions)作为运行期监控和管理的标准机制,几乎每个像样一点的Java服务都在用。但正因为太“标配”了,很多人只是随手在启动脚本里加了一行-Dcom.sun.management.jmxremote.port9010,却完…

2026/10/17 5:27:25 阅读更多 →
qui:把 3 台 qBittorrent 实例装进一个 WebUI 的实操笔记

qui:把 3 台 qBittorrent 实例装进一个 WebUI 的实操笔记

qui:把 3 台 qBittorrent 实例装进一个 WebUI 的实操笔记 【免费下载链接】qui A fast, single-binary qBittorrent web UI: manage multiple instances, automate torrent workflows, and cross-seed across trackers. 项目地址: https://gitcode.com/GitHub_Tre…

2026/10/17 5:27:25 阅读更多 →
SQL添加数据全攻略:INSERT、批量插入与冲突处理

SQL添加数据全攻略:INSERT、批量插入与冲突处理

前阵子有个小组的后台接口频繁报警,查了半天发现是日志表的数据写入方式太原始——一条一条循环INSERT,压测一上来直接拖垮了数据库连接池。那一刻我又想起刚学SQL时的自己:以为“添加数据”就是写一句INSERT INTO ... VALUES就完事了。实际上…

2026/10/17 5:26:25 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →