Skip to main content
 首页 » 编程设计

python之python是如何实现拼接的

2025年05月04日21zhwl

例如,如果我尝试使用 + 运算符将三个字符串连接在一起:s = "s1"+ "s2"+ "s3",python 如何处理好了吗?
它会计算 len1、len2,然后为大小为 len1 + len2 的新字符串分配内存并重复直到处理完所有 + 运算符吗?
或者它可能计算所有操作数的长度并只执行一次分配?在这种情况下,可以安全地假设

s = "s1" + "s2" + "s3" 

会比

执行得更快
s = "s1" + "s2" 
s += "s3" 

或者可能根本没有分配,它只是以某种方式记住操作数的内存地址及其顺序?
非常感谢有关 python 优化主题的文章推荐。

请您参考如下方法:

根据 source在这里,看起来它确实计算了两个字符串的长度,然后创建一个长度等于新长度之和的新字符串

left_len = PyUnicode_GET_LENGTH(left); 
right_len = PyUnicode_GET_LENGTH(right); 
if (left_len > PY_SSIZE_T_MAX - right_len) { 
    PyErr_SetString(PyExc_OverflowError, 
                    "strings are too large to concat"); 
    return NULL; 
} 
new_len = left_len + right_len; 
 
maxchar = PyUnicode_MAX_CHAR_VALUE(left); 
maxchar2 = PyUnicode_MAX_CHAR_VALUE(right); 
maxchar = Py_MAX(maxchar, maxchar2); 
/* Concat the two Unicode strings */ 
result = PyUnicode_New(new_len, maxchar); 

对于三个字符串,它连接前两个字符串,然后将结果连接到第三个字符串。

当您通过 dis.dis 反汇编函数时, 你可以看到 BINARY_ADD操作码,这是用重载的+ 进行的字符串连接操作,对s1 和s2 完成,然后在上一个操作的结果上用s3

In [34]: def f(s1,s2,s3):  
    ...:     return s1+s2+s3  
    ...:                                                                         
 
In [35]: dis.dis(f)                                                              
  2           0 LOAD_FAST                0 (s1) 
              2 LOAD_FAST                1 (s2) 
              4 BINARY_ADD 
              6 LOAD_FAST                2 (s3) 
              8 BINARY_ADD 
             10 RETURN_VALUE