string.upper (<str>) и <str>.upper () не будут выполняться - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть следующий бит кода:

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) (и добавлю строку импорта в начале). Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 3 ]

14 голосов
/ 27 февраля 2012

Строки неизменны .Таким образом, такие функции, как 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.

7 голосов
/ 27 февраля 2012

Вы не понимаете, что строки в Python неизменны и что строковые методы и операции возвращают новые строки.

>>> print 'ppp'.upper()
PPP
3 голосов
/ 27 февраля 2012

String является неизменным объектом, поэтому при вызове

string.upper()

python сделает копию строки, а когда вы вернетесь, вызовите

print string

, это будетисходная строка в нижнем регистре.Поэтому, когда вам нужна версия в верхнем регистре, вы должны сказать:

print string.upper()
...