linq 分组拼接字符串不支持_理解Python中用'+'连接字符串的背后

Python中字符串的连接有很多方法,比如str.join()方法、str.format()方法、(%)操作符拼接等。

但是我身边很多人都习惯使用(+)操作符,我总结了下有两个原因:

  1. 在官方文档及一些培训教程里面都写着可以用(+)操作符
db2705585fbc06ea433b1633daadbc56.png

2.很多程序员都是学习、甚至同时使用多种编程语言,比如在JAVA中用(+)操作符连接字符串是常用的,所以也就习惯了。

但是在Python中使用(+)操作符连接字符串的操作效率低下

因为python中使用 + 拼接两个字符串时会生成一个新的字符串,生成新的字符串就需要重新申请内存,拼接字符串较多时自然会影响效率。

问题的核心:重新申请内存,为啥呢?

不可变对象

不可变对象就是这个对象一旦创建了,就不能修改了。Str就是不可变对象。

来段代码解释吧:

>>> s1= 'abc' #1

>>> s2 = s1.replace('ab','AB') #2

>>> s1

'abc'

>>> s2

'ABc'

#1 如下图,变量s1指向字符串对象'abc'

b6e31bb653aa3e1b0e19262df2f284f0.png

#2 如下图,执行s1.replace('ab','AB')后,

变量s1依然指向字符串对象'abc',虽然在s1对象上调用方法replace('ab','AB'),但是由于s1(Str)类型是不可变对象,所以新建字符串对象'ABc',变量s2指向字符串对象'ABc'。

9ddcd9c01c9df575cd0b8e29d122336d.png

这就是不可变对象Str,让我们接着往下看。

(+)字符串连接内存图解

上代码:

>>> s1= '01'

>>> s2= 'code'

45a086971e64feb569047e14d5e65257.png

创建变量s1、s2,分别指向字符串对象'01'、'code'。

>>> s2= s1 + s2 #字符串拼接

>>> s1

'01'

>>> s2

'01code'

84bf2780c74a3fd2dbdfd487a1fcdba1.png

执行s2= s1 + s2操作后,s2指向新建字符串对象'01code'。

也就是说使用 + 拼接两个字符串时,将生成新的字符串,需要重新申请内存,效率低下。

建议字符串连接方法,F-strings拼接

在 Python 3.6 版本之前,推荐两种:% 和 str.format()。

>>> '%s %s!' % ('01', 'code')

'01 code!'

>>> '{} {}!'.format('01', 'code')

'01 code!'

在python3.6.2版本中, 提出F-strings拼接,一种更明确且更方便的方式,且把python表达式嵌入到字符串中来进行格式化。(F-strings一直用一直爽啊,我现在基本离不开的,支持3.6及以上版本哦!)

>>> s1 = '01'

>>> s2 = 'code'

>>> f'{s1} {s2}!'

'01 code!'

而且F-strings的运行速度很快,比%和str.format()这两种格式化方法都快得多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值