2017-10-12 3 views
-3

私は文字列のリストを持っていて、リスト内の各文字列に別の文字列を追加したいのです。私は文字列が変更可能だと思ったが、その結果は反対である。ここに私の例である:+ +文字列を追加して変更可能なリストを変更できますか?

a = ["abc", "def", "ghi"] 
for v in a : 
    v += "x" 
assert a == ["abc", "def", "ghi"] 

「X」([「ABCX」、「defx」、「ghix」])の各要素に追加されていない理由を文字列のリストは、変更可能ですか?

+3

リストは変更可能ですが、文字列はありません。 –

+0

@ Jean-Francois Fabreヒントをありがとう。だから、リストは包括的にストリングに適用され、ストリングは変更できますか? –

+0

文字列は変更できませんが、あなたのリストの古いバージョンを投げ捨てて、あなたが望む内容の新しいものを手に入れることができます –

答えて

2

リストは変更可能ですが、その中の文字列は変更できません。だから、やるとき:

a = ["abc", "def", "ghi"] 
for v in a : 
    v += "x" 

+=オペレータにもかかわらず、文字列は不変なので、v変更の参照(および添付のxと値が失われます)。あなたは

を行うことができます:

for i in range(len(a)): 
    a[i] += "x" 

が、非常にunpythonicのインデックスにループ。興味深いのは、いくつかの値を変更する必要があるときだけです(インデックスによる「ランダム」アクセス)。 aリストの場合は、「インプレース」で動作します。

あなたはリストの内包表記を使用してリストを再構築することができ、それが最も神託の方法(代わりにそれを修正するの、aに代わる)になります。

a = [i+"x" for i in a] 
+0

シンプルでわかりやすくするのはpythonicです。 1つの要素だけを変更する必要があるときは、リスト全体を再構築してください。それはちょっとばかりです。 – trentcl

+0

ここでは、すべての要素が1つだけでなく、ここで突然変異していることに注意してください。そうでなければ私は同意する。 –

+0

十分な公正。私はおそらく、このサイトのリスト内包物の無償使用には敏感になりすぎました。 – trentcl

関連する問題