是python+;=字符串连接错误的做法?
我正在阅读,这里有一个简短的代码片段是python+;=字符串连接错误的做法?,python,string,string-concatenation,Python,String,String Concatenation,我正在阅读,这里有一个简短的代码片段 foo = 'foo' bar = 'bar' foobar = foo + bar # This is good foo += 'ooo' # This is bad, instead you should do: foo = ''.join([foo, 'ooo']) 作者指出,'.join()并不总是比+快,因此他并不反对使用+进行字符串连接 但是为什么foo+='ooo'是坏习惯,而foobar=foo+bar被认为是好习惯呢 foo+=b
foo = 'foo'
bar = 'bar'
foobar = foo + bar # This is good
foo += 'ooo' # This is bad, instead you should do:
foo = ''.join([foo, 'ooo'])
作者指出,'.join()
并不总是比+
快,因此他并不反对使用+
进行字符串连接
但是为什么foo+='ooo'
是坏习惯,而foobar=foo+bar
被认为是好习惯呢
好吗foo+=bar
好吗foo=foo+'ooo'
- 作者没有给出任何理由。也许这只是他/她不喜欢的
- Python文档没有提到这是一种糟糕的做法(据我所见)
同样可读(根据我的说法),速度大约是foo+='ooo'
foo=''的100倍。加入([foo,'ooo'])
当连接字符串时,Python只需为最后一个字符串分配新内存,这样效率更高,但计算时间可能更长。此外,由于字符串是不可变的,因此使用字符串列表进行动态变化通常更为实际,并且仅在需要时将其转换为字符串 使用str.join()创建字符串通常很方便,因为它需要一个iterable。例如:
letters = ", ".join("abcdefghij")
总结
在大多数情况下,使用str.join()
更有意义,但有时串联也是可行的。对于大字符串或多个字符串,使用任何形式的字符串连接都是不好的做法,正如在我看来,对于短字符串和少数字符串,使用str.join()
都是不好的做法
我相信作者只是试图创建一个经验法则,以便更容易地确定何时使用什么,而不需要太多细节或使其复杂化。如果字符串的数量很小并且事先知道字符串,我会:
foo = f"{foo}ooo"
使用。然而,这只有在python 3.6之后才有效。@jornsharpe:这个问题实际上并不包括循环之外的单个增广赋值情况。坦率地说,我对指南中的这一说法感到非常惊讶,因为
foo+bar
和foo+=bar
之间没有技术上的区别,但显然foo+='oo'
是有区别的。这里的问题是+
与'.join()
的速度。这里比较了使用+
的两种方法。我认为指南中的推理是,对于字符串创建str.join()
并不总是更好,foobar=''。join(foo,bar)
并不比foobar=foo+bar
更好。如果您查看整个语句,就可以清楚地看出,这是一个例外,因为在大多数情况下,join()
比+=
更可取。给定的示例可能会有所改进。foo='''.join([foo,'ooo'])
在这个示例中似乎有些过分。根据timeit模块的一些测试,它不仅可读性差,而且比其他示例慢100倍。我看不出foo+='ooo'
。。。需要指出的是,《搭便车者指南》的作者在性能方面提到了“好”和“坏”:在一个可变的列表中积累部分,然后在需要完整字符串时将这些部分粘在一起(“连接”)是更有效的.join(school),额外的生成器表达式不会提高可读性,只会降低效率。除非您需要处理name
(修改、筛选、索引等),否则没有理由使用生成器表达式是的,您完全正确!这是我的一个错误,我将改变这个例子。@TedKleinBergman the,“。join(range(10))
可能不是最好的例子,因为它会失败…@JonClements是的,我不知道我在想什么。我现在有点忙/有点紧张,但我会确保添加一个更好的示例later@TedKleinBergman别担心。。。可能使用letters=','.join('abcdefghij')
或其他方式显示它。。。理解要点…问题不是寻找“如何连接字符串”。这是关于“为什么是foo+='ooo'
bad practice”(为什么是foo+='ooo'
bad practice)的问题。这并不能回答这个问题。一旦你有足够的钱,你将能够;相反-