没有'+'运算符的字符串连接

ibr*_*him 57 python string optimization concatenation string-concatenation

我正在玩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
Run Code Online (Sandbox Code Playgroud)

现在我有两个问题:

  1. 为什么语句3在语句1中不起作用?
  2. 在声明1和声明2之间是否存在任何技术差异,如计算速度等?

Ter*_*ryA 49

来自文档:

允许使用多个相邻的字符串文字(由空格分隔),可能使用不同的引用约定,并且它们的含义与它们的连接相同.因此,"你好"'世界'相当于"helloworld".


声明3不起作用,因为:

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

请注意,文档中子标题的标题也是"字符串文字串联".这仅适用于字符串文字,而不适用于其他对象.


可能没什么区别.如果有,它可能非常小,没有人应该担心.


另外,要明白这可能存在危险:

>>> def foo(bar, baz=None):
...     return bar
... 
>>> foo("bob"
... "bill")
'bobbill'
Run Code Online (Sandbox Code Playgroud)

这是错误永远不会无声传递的完美示例.如果我想"bill"成为这个论点baz怎么办?我有一个逗号,但没有错误.相反,连接已经发生.

  • 我认为你的回答这句话很有趣。我想那些将其视为对 Python 设计的批评的人可能会严厉批评它,和/或认为它是主观的。但这确实可能是一个陷阱,因此 Python 用户需要意识到这一点,并在发生这种情况时识别症状。这同样适用于 C 和 C++。 (3认同)
  • 所以"错误永远不应该默认通过"在这种情况下意味着应该定义语法,如果从任何有效的程序中删除逗号,结果程序要么无效,要么与原始程序具有相同的含义?我的意思是语法上重要的逗号,ofc,规则不应该适用于从字符串文字中删除逗号;-) (2认同)
  • 另一个适用于Python和C的例子(尽管逗号并不意味着相同的事情):`1 - 1`和`1, - 1`是不同的.基本上,上下文敏感的运算符导致这样的示例,并置实际上将令牌边界转换为上下文敏感的运算符.字符串连接是一个特别容易犯的错误,因为将断行符引入逗号分隔的字符串列表是很常见的.如果你写了`foo(1,<newline> -1)`那么你实际上就会有相同的语言缺乏能力来告诉你什么时候离开尾随的逗号. (2认同)
  • @SteveJessop哇,太棒了.我以前曾尝试过学习C++,但我从来没有深入研究它,因为我非常喜欢python(尤其是它的语法),但你在这里教过我很多.谢谢! (2认同)
  • 这是python的一个可怕的“特性”。我的程序只是默默地失败了,因为我在为 Pandas 标题输入一长串名称时错过了一个逗号。 (2认同)

use*_*ica 6

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