会员
周边
新闻
博问
闪存
赞助商
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
小小张说故事
博客园
首页
新随笔
联系
订阅
管理
1
2
3
4
5
下一页
2026年11月11日
Python 里 str 和 bytes 到底差在哪:拆开 UTF-8 变长编码、PEP 393 内存布局和 surrogateescape
摘要: 一句话结论:str 是 Unicode 码点序列,bytes 是 0–255 的整数序列。两者之间那道 .encode() / .decode(),是一次有规则的换算,不是「加个 b 前缀」。 本文所有数字来自本机 CPython 3.13.14 实测。 一、同一个字符,长度可以是 1、2、3、4
阅读全文
posted @ 2026-11-11 10:21 小小张说故事
阅读(1)
评论(0)
推荐(0)
2026年11月10日
Python 里为什么改了 __eq__ 就进不了集合:拆开 __hash__、可哈希契约与可变 key 陷阱
摘要: 一句话结论:只要你在类里定义了 __eq__ 而没显式定义 __hash__,CPython 会把 __hash__ 直接设成 None,实例立刻变成「不可哈希」,放进 set 或当 dict 键都会抛 TypeError: unhashable type。这不是 bug,是语言在替你守住一条契约:
阅读全文
posted @ 2026-11-10 10:26 小小张说故事
阅读(3)
评论(0)
推荐(0)
2026年11月9日
Python 里 __x 到底被改名成了什么:拆开 name mangling、继承里的 _Cls__x 和「其实根本不私有」的真相
摘要: 写类的时候,self.__x 几乎被当成「私有属性」的同义词。但真去 obj.__x 取,会得到一个 AttributeError;obj._Cls__x 却能拿到值。这中间的 _Cls__ 是谁加的、什么时候加的、继承后又会变成什么样? 一句话结论:Python 没有私有属性。类体里以两个下划线开
阅读全文
posted @ 2026-11-09 09:54 小小张说故事
阅读(2)
评论(0)
推荐(0)
2026年11月8日
Python 里 def f(x=[]) 为什么每次调用都共用同一个列表?拆开 __defaults__ 和函数对象创建时那一次求值
摘要: 几乎每个 Python 教程都会警告「别用可变对象当默认参数」,但多数只给结论不给机制:为什么是共享的?那个列表到底存在哪儿?什么时候被求值一次? 一句话结论:默认参数不是每次调用时创建的,而是在 def 语句执行、函数对象被创建那一刻求值一次,之后作为 __defaults__ 元组挂在函数对象上
阅读全文
posted @ 2026-11-08 12:39 小小张说故事
阅读(3)
评论(0)
推荐(0)
2026年11月7日
Python 里 del x 到底删掉了什么?拆开引用计数、4294967295 和分代 GC 漏掉的那圈循环引用
摘要: 很多人写过 del x 之后顺手去看内存,发现没降,于是怀疑「Python 不释放内存」。其实 del 从来就不负责释放对象,它只删掉一个名字。 一句话结论:CPython 靠引用计数即时回收,计数归零的那一刻对象就没了;但两个对象互相引用时,计数永远归不了零,这部分要靠分代 GC 补。del 只是
阅读全文
posted @ 2026-11-07 09:48 小小张说故事
阅读(6)
评论(0)
推荐(0)
2026年11月6日
Python 的 match 到底能不能当 switch 用?拆开解构、守卫与那个故意不做的 fallthrough
摘要: Python 3.10 加了 match 之后,最常见的一句评价是「终于有 switch 了」。这句话方向就错了。 一句话结论:match 不是 switch,它是「结构化模式匹配」——匹配的是数据的形状,不是值;它没有 fallthrough,是语句不是表达式,而且比 dict 分派还快。 以下全
阅读全文
posted @ 2026-11-06 09:19 小小张说故事
阅读(5)
评论(0)
推荐(0)
2026年11月5日
Python 的 list[int] 为什么不是 list?拆开 __class_getitem__ 和那层 80 字节的薄包装
摘要: 先看几行我在本机跑出来的结果(CPython 3.13.14): >>> type(list[int]) <class 'types.GenericAlias'> >>> list[int] is list[int] False >>> list[int] == list[int] True >>>
阅读全文
posted @ 2026-11-05 15:08 小小张说故事
阅读(5)
评论(0)
推荐(0)
2026年11月4日
Python 的 assert 为什么不能用来校验参数?拆开 -O 模式与那行会被整段删掉的代码
摘要: 先看一段很像「标准写法」的代码: def divide(a, b): assert b != 0, "除数不能为 0" return a / b 用 python main.py 跑,传 b=0 会抛 AssertionError: 除数不能为 0,看着挺稳妥。 用 python -O main.p
阅读全文
posted @ 2026-11-04 09:29 小小张说故事
阅读(5)
评论(0)
推荐(0)
2026年11月3日
Python 的默认参数为什么不能用 []?拆开 __defaults__ 里那个被所有人共享的列表
摘要: 先看一段能让人怀疑人生的代码: def add(x, lst=[]): lst.append(x) return lst print(add(1)) # [1] print(add(2)) # [1, 2] ← 为什么不是 [2]? print(add(3)) # [1, 2, 3] 函数里一行"重
阅读全文
posted @ 2026-11-03 09:05 小小张说故事
阅读(4)
评论(0)
推荐(0)
2026年11月2日
Python 的 range 为什么能装下一亿个数还不卡?拆开惰性序列与懒计算
摘要: 先做个实验: import sys print(sys.getsizeof(range(100))) # 48 print(sys.getsizeof(range(10**8))) # 48 range(1) 和 range(100000000) 占的内存一模一样,都是 48 字节。一亿个整数,每个
阅读全文
posted @ 2026-11-02 09:59 小小张说故事
阅读(3)
评论(0)
推荐(0)
1
2
3
4
5
下一页
公告