web-dev-qa-db-ja.com

python + =文字列連結の悪い習慣ですか?

The Hitchhiker's Guide to Python を読んでいます。短いコードスニペットがあります

_foo = 'foo'
bar = 'bar'

foobar = foo + bar  # This is good
foo += 'ooo'  # This is bad, instead you should do:
foo = ''.join([foo, 'ooo'])
_

著者は、''.join()が常に_+_より速いとは限らないことを指摘したので、文字列の連結に_+_を使用することに反対していません。

しかし、なぜ_foo += 'ooo'_は悪い習慣であるのに_foobar=foo+bar_は良いと考えられているのでしょうか?

  • _foo += bar_は良いですか?
  • _foo = foo + 'ooo'_は良いですか?

このコードスニペットの前に、著者は次のように書いています。

文字列について最後に言及することの1つは、join()を使用することが常に最適とは限らないことです。あらかじめ決められた数の文字列から新しい文字列を作成する場合、加算演算子の使用は実際には高速ですが、上記のような場合、または既存の文字列に追加する場合は、join()を使用する必要がありますお好みの方法。

27
nos

それは悪い習慣ですか?

次の理由から、この例では悪い習慣ではないと想定するのは合理的です。

  • 著者は理由を述べていません。たぶんそれは彼/彼女によって嫌われているだけかもしれません。
  • Pythonのドキュメントには、それが悪い習慣であるとは記載されていません(私が見たものから)。
  • _foo += 'ooo'_は(私によると)同じくらい読みやすく、foo = ''.join([foo, 'ooo'])よりも約100倍高速です。

一方を他方に対して使用する必要があるのはいつですか?

文字列の連結には、新しい文字列を作成して新しいメモリを割り当てる必要があるというデメリットがありますすべての連結に対して!これには時間がかかりますが、少数の小さな文字列ではそれほど大きな問題ではありません。連結する文字列の数がわかっていて、2〜4個以上の連結が必要ない場合は、それを選びます。


文字列を結合するときPythonは最終的な文字列に新しいメモリを割り当てるだけで、はるかに効率的ですが、計算に時間がかかる可能性があります。また、文字列は不変であるため、動的に変更する文字列のリスト。必要な場合にのみ文字列に変換します。

反復可能を使用するため、str.join()を使用して文字列を作成すると便利な場合がよくあります。例えば:

_letters = ", ".join("abcdefghij")
_

結論する

ほとんどの場合、str.join()を使用する方が理にかなっていますが、連結が同様に実行可能な場合があります。私の意見では、str.join()を使用すると短い文字列と少数の文字列が悪い習慣になるのと同じように、巨大な文字列または多くの文字列に任意の形式の文字列連結を使用するのは悪い習慣です。

著者は、あまり詳細に説明したり複雑にしたりすることなく、いつ何を使用すべきかを簡単に識別できるように、経験則を作成しようとしていたと思います。

41