不使用“+”运算符的字符串连接

问题描述 投票:0回答:6

我正在使用 python,我意识到我们不需要使用“+”运算符来连接静态字符串。但如果我将它分配给一个变量,它就会失败。

例如:

string1 = 'Hello'   'World'  #1 works fine
string2 = 'Hello' + 'World'  #2 also works fine

string3 = 'Hello'
string4 = 'World'
string5 = string3   string4  #3 causes syntax error
string6 = string3 + string4  #4 works fine

现在我有两个问题:

  1. 为什么语句 3 不起作用而语句 1 起作用?
  2. 语句1和语句2之间有计算速度等技术差异吗?
python string optimization concatenation string-concatenation
6个回答
74
投票

来自 Python 3.12 文档

允许使用多个相邻的字符串文字(由空格分隔),可能使用不同的引用约定,并且它们的含义与其串联相同。因此,

"hello" 'world'
相当于
"helloworld"


语句 3 不起作用,因为:

“+”运算符必须用于在运行时连接字符串表达式。

请注意,文档中子标题的标题也是“字符串文字连接”。这只适用于字符串文字,不适用于其他对象。


可能没有什么区别。如果有的话,它可能非常小,任何人都无需担心。


此外,请了解这样做可能存在危险:

>>> def foo(bar, baz=None):
...     return bar
... 
>>> foo("bob"
... "bill")
'bobbill'

这是一个完美的例子,说明错误永远不应该悄无声息地过去。如果我希望

"bill"
成为参数
baz
怎么办?我忘记了逗号,但没有出现错误。相反,发生了串联。


6
投票

这是隐式字符串文字连接。它只发生在字符串文字上,而不是变量或其他计算结果为字符串的表达式上。过去存在(微小的)性能差异,但现在,窥视孔优化器应该使表单基本上等效。


4
投票

回答你的第二个问题:根本没有区别(至少对于我使用的实现来说)。拆解这两个语句,它们呈现为

LOAD_CONST STORE_FAST
。它们是等价的。


4
投票

您可以使用

%s
,因为这比使用 + 号更有效。

>>> string2 = "%s %s" %('Hello', 'World')
>>> string2
'Hello World'

(或)


还有一种方法是

.format

>>> string2 = "{0} {1}".format("Hello", "World")
>>> string2
'Hello World'
>>> 

1
投票

语句 3 不起作用,因为当您连接两个字符串表达式来创建新字符串时,您需要“+”运算符。

而在字符串 1,2 和 4 的情况下,由空格分隔的相邻文字使用不同的引用约定。因此允许它们打印与连接相同的内容。

此外,运行这两个操作不会有任何显着或明显的时间差异。

%%timeit -n 1
s1='ab'
s2='ba'
print(s1+s2)

o/p 最慢的跑步时间是最快跑步时间的 17.08 倍。这可能意味着正在缓存中间结果。 每个循环 57.8 µs ± 92.5 µs(7 次运行的平均值 ± 标准差,每次 1 个循环)

%%timeit -n 1
s3='ab' 'ba'
print(s3)

o/p 最慢的跑步时间是最快跑步时间的 4.86 倍。这可能意味着正在缓存中间结果。 每个循环 25.7 µs ± 21 µs(7 次运行的平均值 ± 标准差,每次 1 个循环)


1
投票

为什么语句 3 不起作用而语句 1 起作用?

因为,在第一个语句中,我们将一些常量分配给变量。变量赋值非常简单,我们可以继续将多个常量放入一个变量中,并且赋值仍然会进行。术语

"hello"
"world"
是两个相同类型的常量。所以,该声明有效。

如果我们执行以下操作,我们将得到

SyntaxError

string1 = "Hello" 1

原因是我们在单个变量赋值中提供了多个常量。这让 python 感到困惑,并将其作为错误抛出。

语句3是关于根据两个变量分配一个变量。这将产生

SyntaxError
,因为 python 在将 2 个变量分配给变量之前不知道它可以对它做什么。

语句1和语句2之间有计算速度等技术上的差异吗?

是的。唯一的技术区别是可读性而不是其他任何东西。可读性在 Python 中最重要。对于未经训练的人来说,

"hello"  "world"
可能看起来编译器会向字符串添加空格。事实并非如此。

但是,

"hello" + "world"

是明确且正常的。几乎总是,显式优于隐式。

© www.soinside.com 2019 - 2024. All rights reserved.