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

时间:2013-09-17 06:34:07

标签: 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

现在我有两个问题:

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

6 个答案:

答案 0 :(得分:49)

来自docs

  

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


声明3不起作用,因为:

  

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

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


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


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

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

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

答案 1 :(得分:2)

回答你的第二个问题:完全没有区别(至少我使用的实施方式)。反汇编这两个语句,它们呈现为LOAD_CONST STORE_FAST。它们是等价的。

答案 2 :(得分:2)

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

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

(OR)

另一种方法是.format

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

答案 3 :(得分:1)

这是隐式字符串文字串联。它只发生在字符串文字中,而不是变量或评估为字符串的其他表达式。曾经存在(微小的)性能差异,但是现在,窥视孔优化器应该使形式基本相同。

答案 4 :(得分:1)

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

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

此外,运行这两项操作不会有任何重大或明显的时差。

#!/bin/bash

source=/home/username/documents
dest=/myBackup

if [ "$1" == "--install" ] ; then
    echo "installing..."
    cp $0 /etc/cron.daily/myBackupScript
    mkdir $dest
    echo "installed"
    exit 0
fi

for i in {0..9999}; do
    if [ ! -e ${dest}/$i ]; then
        echo "Copying to " ${dest}/$i
        if [ -d ${dest}/$((i-1)) ]; then
            rsync --checksum --recursive ${source} ${dest}/$i --link-dest=${dest}/$((i-1))
        else
            rsync --checksum --recursive ${source} ${dest}/$i
        fi
        DATE=`date +%Y-%m-%d__%H:%M:%S`
        touch ${dest}/$i/$DATE
        exit 0
    fi
done
echo "unable to do backup"
exit 4

O / P 最慢的运行时间比最快的运行时间长17.08倍。这可能意味着正在缓存中间结果。 每回路57.8μs±92.5μs(平均值±标准偏差,7次运行,每次1次循环)

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

O / P 最慢的运行时间比最快的运行时长4.86倍。这可能意味着正在缓存中间结果。 每回路25.7μs±21μs(平均值±标准偏差,7次运行,每次1次循环)

答案 5 :(得分:0)

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

因为在第一条语句中,我们为变量分配了一些常量。变量赋值非常简单,因此我们可以继续将多个常量放入单个变量,赋值仍将继续进行。术语"hello""world"是两个相同类型的常量。因此,该声明有效。

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

string1 = "Hello" 1

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

语句3全部关于基于两个变量分配变量。这将产生SyntaxError,因为python在将2个变量赋给变量之前不知道它能做什么。

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

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

但是

"hello" + "world"

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