是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'
    好吗
在这段代码之前,作者写道:

关于字符串的最后一点是,使用join()并不总是最好的。在从预定数量的字符串创建新字符串的情况下,使用加法运算符实际上更快,但在上述情况下或在向现有字符串添加的情况下,使用join()应该是首选方法

这是坏习惯吗? 可以合理地假设,对于本例来说,这并不是一种糟糕的做法,因为:

  • 作者没有给出任何理由。也许这只是他/她不喜欢的
  • Python文档没有提到这是一种糟糕的做法(据我所见)
  • foo+='ooo'
    同样可读(根据我的说法),速度大约是
    foo=''的100倍。加入([foo,'ooo'])
什么时候应该使用一个而不是另一个? 串接的缺点是需要创建一个新字符串并为每个串接分配新内存!这很费时,但如果字符串很少且很小,这并不是一件大事。当您知道要连接的字符串的数量并且不需要超过2-4个连接时,我会选择它


当连接字符串时,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)的问题。这并不能回答这个问题。一旦你有足够的钱,你将能够;相反-