2012-02-27 67 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 2012-02-27 08:25:43

+0

修正!感謝您指出。 – varunl 2012-02-27 08:30:18

7

你不知道Python中的字符串是不可變的,並且字符串方法和操作返回新的字符串。

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

#這個。你必須做一些像 片段== fragment.upper() 有一個過濾器使用.replace相同的問題...它花了我很長時間,直到我明白這一點。現在我不會再忘記它了:D – 2012-02-27 09:53:50

3

String是一個不可變對象,所以當你打電話

string.upper() 

蟒蛇將使字符串的副本,當你回來叫

print string 

,這將是原來的字符串,這是小寫。所以當你需要它的大寫版本時,你必須說:

print string.upper() 
+0

'string'是一個很棒的圖書館。不要將它用於變量名稱。 – eumiro 2012-02-27 08:26:31

+0

是的,我明白了。我想我將無法將字符串作爲名稱指定給變量:) – 2012-02-27 15:21:14