NLTK

Stars

经典自然语言处理工具库,覆盖分词、词性标注、句法与语义分析、语料库接口和教学资源,为 NLP 研究、原型验证与课程实践提供稳定基础设施。

PYTHON OBJECT MODEL · STATE ISOLATION

看似独立的对象,不该共享同一份状态

可变默认参数只创建一次。两个 Concept 实例如果拿到同一个容器,一次局部修改就会变成跨对象污染。

BEFORE · MUTABLE DEFAULT
Concept AConcept B
shared [] / set()A.add(...) → B changed
STATE LEAK
AFTER · NONE SENTINEL
Concept Alabels_A · set_AConcept Blabels_B · set_B
A ≠ B · ISOLATED
状态泄漏

三个默认容器跨实例复用

chat80.Concept 的 altLabels、closures 与 extension 使用可变默认参数,多个默认构造实例会静默共享同一组容器;修改一个概念,后续概念的状态也会被污染。

语言语义

默认参数在定义时创建一次

根因不是 chat80 数据内容,而是 Python 默认参数只在函数定义时创建一次。三个容器跨实例复用,因此对象表面独立,底层状态实际相连;显式传入的容器则应继续保留调用者语义。

初始化边界

None 哨兵按实例分配容器

将三个可变默认值替换为 None 哨兵,仅在调用者未提供容器时为当前实例创建新的 list 与 set,同时保留显式传入容器,并加入双实例状态隔离回归用例。

兼容结果

隔离默认状态,保留显式输入

Concept 实例恢复真正的状态隔离,避免标签、闭包和扩展集合发生跨对象泄漏;修复覆盖全部三个默认容器,并作为 NLTK 贡献者写入 AUTHORS.md。