0

次のコードがあります。

secretWord = 'hello'
letter = 'l'
tag = '_ '*len(secretWord) # tag = '_ _ _ _ _'

for m in rage(len(secretWord)):
    if letter == secretWord[m] and m == 0:
         tag.replace(tag[m],letter)
    else:
         tag.replace(tag[m+2],letter)

私が望む望ましい出力はtag = '_ _ l l _' 、私の論理が完全に正確であっても、何らかの理由でこれを機能させることができないということです。secretWord の各文字を対象とする for ループがあります。for ループのその時点で文字がその特定の文字と等しい場合は、タグ内の適切な位置をその文字に置き換え、他のすべての空白 (' _ ') を同じに保ちます。

4

2 に答える 2

3

文字列は Python では不変であり、変更することはできません。tagこれが、更新されていない理由です。

Python には非常に奇妙ですが、便利なデータ モデルがあります。変更可能な型 (リストや辞書など) もあれば、変更できない型 (文字列や数値など) もあります。

文字列インスタンスのreplace()関数 (および実際には他のすべての文字列関数) は、文字列を変更できません。代わりに、元の文字列の新しい変更バージョンを返します。

Python と C/C++ などのアンマネージ プログラミング言語の大きな違いの 1 つは、Python では変数が常に値への参照であるのに対し、C/C++ では変数が値の実際のストレージであることです。

不思議なことに、Python で開始する場合、特定のアルゴリズムの構文が同じであるため、これはある程度無視できます。何かのようなもの:

a = 7
a += 35
s = "Hello"
s += " World"

yielda = 42s = "Hello World"Python および C/C++ で。これは C/C++ では明らかですが、Python ではまったく自明ではないことが起こります。

Python ではs、最初に文字列を参照します"Hello"(not:s文字列を含む"Hello")。次に、文字列Helloと文字列Worldが連結され、参照sが新しい文字列を指すようにリセットされます"Hello World"

次のことは、a = b常に意味することです: 参照をコピーします。値をコピーすることはありません。文字列と整数の場合、実際には大きな違いはありませんが、より複雑な型の場合は違います。しかし、これはおそらくこの質問を超えています。

于 2013-03-29T21:04:10.073 に答える
1

既知tagの文字または空白文字のリストにします。' '.join(tag)必要なときに表示されるフォームを作成するために使用します。


secretWord = 'hello'
letter = 'l'

tag = ['_']*len(secretWord)
tag = [(letter if m == letter else t) for m, t in zip(secretWord, tag)]

print(' '.join(tag))
# _ _ l l _

このソリューションで使用されるツールを説明するリンクを次に示します。

  • [expr for variable in iterable]リスト内包表記です。
  • letter if m == letter else t条件式です。
  • zipsecretWordの文字と の文字 をペアにするために使用されましたtag
  • ' '.join各文字の間にスペースを入れて、文字のリストを 1 つの文字列に結合するために使用されます。
于 2013-03-29T21:04:09.320 に答える