Python字符串拼接方法join和format的源码理解,有大佬给我讲一下吗?

Python 的字符串拼接 join、format 源码理解,有大佬给我讲一下吗?小白刚入门,不知道怎么看源码,有大佬告知一下怎么看源码之类的,万分感谢。


Python字符串拼接方法join和format的源码理解,有大佬给我讲一下吗?
10 回复

百度一下很难吗,我都不想说谷歌了


join和format的源码实现思路完全不同。

join是字符串对象的方法,但实际调用的是序列中每个元素的__str__()方法。在CPython源码Objects/stringobject.c中,join的核心逻辑是:

  1. 计算序列中所有字符串的总长度
  2. 分配足够的内存空间
  3. 依次拷贝每个子字符串到目标位置

关键点:join要求序列元素必须是字符串,因为它直接进行内存拷贝,效率很高。

format则是通过__format__协议实现的。在Objects/stringobject.c的string_format()函数中:

  1. 解析花括号{}中的格式说明符
  2. 调用对应对象的__format__()方法
  3. 根据格式说明进行格式化(如对齐、填充、精度等)

format更灵活,可以处理各种数据类型,但解析格式字符串需要额外开销。

简单说:join是简单的内存拼接,format是复杂的格式化引擎。

放心吧,不会有人给你讲的

join 是首先遍历 list 中的每一个字符串确定 maxchar 通过 maxchar 和所有字符串的长度和 sz 通过 PyUnicode(sz,maxchar) 创建新的字符串对象 然后通过每一个字符串的长度和偏移将 list 字符串快速拷贝到新串中。
format 其实是先通过 FORMAT_VALUE 将其他类型转换为 str 类型并且把 str 压入栈。然后进行 join

join 和 format 两个都落实到 _PyUnicode_JoinArray()这个函数上去了。

比如 f"{100},200,{300}"等同与’’.join([‘100’,’,200,’,‘300’])

说到效率问题因为 join 只能连接字符串而且 FORMAT_VALUE 这个字节码他的具体计算会落实到 Python 实现所以转化的效率不高。

也就是说 join 和 format 的效率区别在于 format 需要将其他类型转化成为 str 而且这个转化过程还是 Python 实现的而 join 只针对与 str.

觉得楼主想问的是 join format 怎样用

找本书去看

多练习几个语句就好了,又不会怀孕。

上来就造原子弹?

我一直认为看 python 源码对于学 python 没啥用,这是我不看源码的理由

你说的还特么有点道理的, /坏笑

回到顶部