出力を割り当てない限り、Python文字列メソッドを呼び出さないのはなぜですか?


136

単純な文字列置換を実行しようとしましたが、それが機能しないように見える理由がわかりません。

X = "hello world"
X.replace("hello", "goodbye")

単語helloをに変更したいgoodbyeので、文字列"hello world"をに変更する必要があります"goodbye world"。しかし、Xはそのまま残り"hello world"ます。コードが機能しないのはなぜですか?

回答:


232

これは、Pythonでは文字列が不変であるためです

つまり、置換されたのコピーがX.replace("hello","goodbye")返さます。そのため、次の行を置き換える必要があります。X

X.replace("hello", "goodbye")

この行で:

X = X.replace("hello", "goodbye")

より広く、これは「インプレース」の文字列の内容を変更し、すべてのPython文字列のメソッドにも当てはまり、例えばreplacestriptranslatelower/ upperjoin、...

あなたがそれを使いたい、それを捨てたくない場合、あなたはそれらの出力を何かに割り当てなければなりません。

X  = X.strip(' \t')
X2 = X.translate(...)
Y  = X.lower()
Z  = X.upper()
A  = X.join(':')
B  = X.capitalize()
C  = X.casefold()

等々。


1
重大なポイント:文字列はx += 'a'特殊なケースに変更できます。例:stackoverflow.com/a/40996908/6260170
Chris_Rands

@Chris_Rands:正しいように見えますが、外部からは実際の可変性の効果はありません-一部の実装では、これが実際に使用されているかどうかをチェックし、そうでない場合(可変性が観察されない)、実際に突然変異します。本当?
Tadeck

@Tadeckまあ、それは本当だと思いますが、それは単なるCPythonの最適化であり、ここでは直接関係ありません(そのため、私は
知識を深め

0

すべての文字列関数としてlowerupperstripオリジナルを変更せずに文字列を返しています。文字列を変更しようとするとwell it is an iterable、思うかもしれませんが、失敗します。

x = 'hello'
x[0] = 'i' #'str' object does not support item assignment

文字列が不変であることの重要性についての良い読みがあります:なぜPython文字列は不変ですか?それらを使用するためのベストプラクティス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.