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

今、私は2つの質問があります:

  1. ステートメント 1 は機能するのに、ステートメント 3 は機能しないのはなぜですか?
  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

2 番目の質問に答えるには: 違いはまったくありません (少なくとも私が使用している実装では)。両方のステートメントを逆アセンブルすると、 としてレンダリングされLOAD_CONST STORE_FASTます。それらは同等です。

于 2013-09-17T06:39:22.027 に答える
0

ステートメント 1 は機能するのに、ステートメント 3 は機能しないのはなぜですか?

最初のステートメントでは、変数に定数を代入しているためです。変数の割り当ては単純なので、1 つの変数に複数の定数を配置し続けても、割り当ては続行されます。"hello""world"は同じ型の 2 つの定数です。したがって、ステートメントは機能しました。

次のようにすると、SyntaxError

string1 = "Hello" 1

その理由は、1 つの変数割り当てで複数の定数を指定したためです。これはpythonを混乱させ、エラーとしてスローしました。

ステートメント 3 は、2 つの変数に基づいて変数を割り当てることに関するものです。これはSyntaxError、Python が変数に割り当てる前に 2 つの変数で何ができるかわからないためです。

文1と文2で計算速度などの技術的な違いはありますか?

はい。唯一の技術的な違いは、何よりも読みやすさです。Python では可読性が最も重要です。慣れていない人に"hello" "world"は、コンパイラが文字列にスペースを追加するように見えるかもしれません。そうではありません。

でも、

"hello" + "world"

明示的で正常です。ほとんどの場合、明示的は暗黙的よりも優れています。

于 2018-07-16T10:24:14.513 に答える