2012-02-27 16 views
2

を実行しません。string.upper(<str>)と<str> .upperは()私は次のコードのビットを持っている

def test(): 
    fragment = '' 
    fragment = raw_input('Enter input') 
    while fragment not in string.ascii_letters: 
     fragment = raw_input('Invalid character entered, try again: ') 
    fragment.upper() 
    print fragment*3 

私はそれを実行したときしかし、pの入力値のために言って、fragmentを取得します'ppp'として出力されます - すべて小文字です。つまり、fragment.upper()行は実行されません。その行をstring.upper(fragment)に置き換えて(最初にのインポート文字列を追加すると同じことが起こります)。誰かが私が間違っていることを教えてもらえますか?

答えて

14

文字列はimmutableです。したがって、str.upper()のような関数はstrを変更しませんが、新しい文字列を返します。あなたのコード内

>>> name = "xyz" 
>>> name.upper() 
'XYZ' 
>>> print name 
xyz # Notice that it's still in lower case. 
>>> name_upper = name.upper() 
>>> print name_upper 
XYZ 

ので、代わりのfragment.upper()、あなたはnew_variable = fragment.upper()を行い、その後、このnew_variableを使用する必要があります。

+0

あなたの変数に 'str'を悪用しないでください。 – eumiro

+0

改訂!それを指摘してくれてありがとう。 – varunl

7

あなたはPythonの文字列が不変であり、文字列のメソッドと演算が新しい文字列を返すことを認識していません。

>>> print 'ppp'.upper() 
PPP 
+0

#このようにする必要があります。 フラグメント== fragment.upper() は、.replace ...を使用したフィルタで同じ問題を抱えていました。これを理解するまでは非常に時間がかかりました。今私はもう一度それを忘れることはないでしょう:D –

3

文字列は不変オブジェクトであるので、あなたは

string.upper() 

のpythonを呼び出すときに文字列のコピーになるだろう、とあなたが戻ってきたときに

print string 

を呼び出し、それが元の文字列になりますこれは小文字です。したがって、大文字のバージョンが必要な場合は、

print string.upper() 
+0

'string'は素晴らしいライブラリです。変数名には使用しないでください。 – eumiro

+0

ええ、私はそれを持っています。私は変数に名前として '文字列'を割り当てることができないと思います:) –

関連する問題