web-dev-qa-db-ja.com

なぜPython文字列は不変ですか?それらを使用するためのベストプラクティス

  1. Python文字列を不変にするデザインの理由は何ですか?プログラミングを簡単にする方法は?
  2. 私はCのような可変文字列に慣れています。可変文字列なしでプログラムするにはどうすればよいですか?ベストプラクティスはありますか?
47
Sergey

文字列を受け取ったら、それが同じままであることを確認します。以下のように、文字列引数を使用してFooを作成し、その文字列を変更するとします。 Fooの名前は突然変更されます。

class Foo(object):
    def __init__(self, name):
        self.name = name

name = "Hello"
foo = Foo(name)
name[0] = "J"

可変の文字列では、悪いことが起こらないように常にコピーを作成する必要があります。

また、単一の文字が長さ1の文字列と変わらないという利便性も得られるため、すべての文字列演算子が文字にも適用されます。

最後に、文字列が不変でなければ、dictのキーとしてそれらを確実に使用できません。それらのハッシュ値が突然変化する可能性があるためです。

不変の文字列を使用したプログラミングについては、数値をオブジェクトとではなくvaluesとして扱うのと同じ方法で文字列を扱うことに慣れてください。 nameの最初の文字を変更すると

name = "J" + name[1:]
45
Fred Foo

不変の文字列は、Cの文字列と比較すると、メモリ割り当てを大幅に簡素化します。長さを推測せず、十分に割り当てられることを期待して、過剰に割り当てます。

それらはより安全です:never Cでできるようにバッファをオーバーランさせることができます。

可変文字列の使用例は1つのみです。

  • 部分文字列または単一の文字を置き換える

All他の文字列の使用例(連結、検索など)可変性は重要ではありません。その他の場合はすべて、可変性は重要ではありません。

Pythonで文字または部分文字列を置き換える場合は、新しい文字列を作成するだけです

x = x[:place] + replacement + x[place+1:]

それは、その斬新なまたは独特の唯一のコードです。


私が理解できない理由のために、以下を追加することが重要であると思われます。

「不変文字列以外の文字列バッファオーバーフローを回避する方法は他にもあります。」

この質問の目的のために(具体的にはPythonについて)、不変の文字列はバッファオーバーフローがないという好ましい結果をもたらします。他の言語については、他の原則、規則、およびニュアンスが適用されます。

10
S.Lott
  1. 不変オブジェクトは自動的にスレッドセーフです。
  2. Python文字列を使用することは、Cの文字列に関連する極度の痛みに比べて簡単です。
8
David Heffernan

不変の文字列は、文字列をコピーする必要なく、辞書や類似のデータ構造のキーになります。不変文字列の周りに可変ラッパーを作成するのは、他の方法よりも簡単です。

7
Rafał Dowgird

不変の文字列はプログラミングをはるかに簡単にします。そのため、C#とJavaも使用します。

文字列が変更可能であった場合、悪意のある呼び出し元があなたの下でそれを変更する可能性があるため、外部から提供された文字列を信頼することはできません。
また、マルチスレッド化がはるかに難しくなります。

3
SLaks

ほとんどの言語には不変の文字列があります。これには、Java、Python、およびC#が含まれます。通常、文字列を連結する場合、言語はまったく新しい文字列を割り当て、2つの文字列の内容を新しい文字列にコピーします。

不変性は、プログラミングを容易にする傾向があります。特に、マルチスレッド環境を扱う場合。

3
Jack Edmonds