73

我在玩 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 之间是否存在计算速度等技术差异?
4

6 回答 6

65

文档

允许使用可能使用不同引用约定的多个相邻字符串文字(由空格分隔),并且它们的含义与它们的连接相同。因此,"hello" 'world' 等价于 "helloworld"。


声明 3 不起作用,因为:

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

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


应该没什么区别吧 如果有,它可能非常小,任何人都不应该担心。


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

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

这是错误永远不应无声传递的完美示例。如果我想"bill"成为论据baz怎么办?我忘记了逗号,但没有引发错误。相反,已经发生了连接。

于 2013-09-17T06:40:04.433 回答
4

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

于 2013-09-17T06:38:21.130 回答
3

回答你的第二个问题:根本没有区别(至少在我使用的实现中)。反汇编这两个语句,它们被呈现为LOAD_CONST STORE_FAST. 它们是等价的。

于 2013-09-17T06:39:22.027 回答
3

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

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

(或者)


另一种方法是.format

>>> string2 = "{0} {1}".format("Hello", "World")
>>> string2
'Hello World'
>>> 
于 2016-06-24T07:44:07.370 回答
1

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

而在 sting 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 个)

于 2018-03-31T16:33:41.457 回答
0

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

因为,在第一个语句中,我们将一些常量分配给一个变量。变量赋值非常简单,因此我们可以继续将多个常量放入单个变量,并且赋值仍然会通过。项"hello""world"是两个相同类型的常数。所以,这个说法奏效了。

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

string1 = "Hello" 1

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

语句 3 是关于基于两个变量分配一个变量。这将产生SyntaxError,因为在将其分配给变量之前,python 不知道它可以对 2 个变量做什么。

语句 1 和语句 2 之间是否存在计算速度等技术差异?

是的。唯一的技术区别是可读性而不是其他任何东西。可读性在 Python 中最重要。对于未经训练的眼睛,"hello" "world"可能看起来编译器会将空格添加到字符串中。事实并非如此。

然而,

"hello" + "world"

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

于 2018-07-16T10:24:14.513 回答