2017-02-16 8 views
-1

Я пытаюсь использовать одну функцию Python, предназначенную для создания каждой буквы в строке в верхнем регистре, но после ее использования строка string не работает над этой строкой. Что я имею в виду, спросите вы? Ну давайте просто скажем, следующие булевы:str.upper() возвращает строку, которая, по-видимому, не равна чему-либо, в том числе другому str.upper()

"b".upper() is "B" 
".".upper() is "." 
".".upper() is ".".upper() 

являются все ложные.

Я так смущен. Он действует, как после преобразования строки в форму upper() вместо того, чтобы возвращать одну и ту же строку с заглавными буквами (это то, о чем говорит документация), она возвращает целый новый объект, который не равен ни одному объекту в тех же условиях.

Установка контрольных точек и просмотр фактических значений переменных кажется бесплодным. Я наматываю на is_graduate_input = input("Enter (y/n)").upper() , и он показывает мне значение «Y», потому что это то, что я вошел. Но потом сразу после этой строки мой оператор print(is_graduate_input is "Y") печатает False?!?! Зачем?!?!

Документация для python гласит, что их алгоритм для ввода букв в верхнем регистре описан в некоторых стандартах Unicode. Я не хочу читать это. Я не думаю, что это поможет. Может кто-то просто скажет мне, что, черт возьми, происходит. Я хочу лечь спать. У меня завтра школа.

+0

См [здесь] (http://stackoverflow.com/questions/132988/is-there-a-difference -between-and-is-in-python) - это плохая идея использовать 'is' для сравнения с чем-либо, кроме одиночных, таких как' None'. Используйте '=='.Очень похоже на то, что происходит в Java с '==' и '.equals()'. – yeputons

+0

@yeputons Это моя проблема?!?! Что мне делать? –

+0

Это, вы должны использовать '==' в Python для сравнения объектов для равенства. Не используйте 'is' вне' None 'и 'is None', если вы четко не понимаете, что вы делаете и почему. – yeputons

ответ

1

is будет возвращать True, если две переменные указывают на тот же идентификатор объекта

== будет возвращать True если объекты, упомянутые переменными равны.

Что вы делаете, это сравнение двух разных объектов здесь и, следовательно, получение False.

"b".upper() is "B" # will return False 

Что будет работать для вас

"b".upper() == "B" # will return True 

Допустим, вы начинаете с

a = "b" 
b = "B" 
print(id(a)) 
print(id(a)) # will print same id as above. 
print(id(b)) 
print(id(b)) # will print same id as above. 

выхода:

4337047792 
4337047792 
4337610568 
4337610568 

Но если вы печатаете идентификатор для a.upper() он вернется новый объект каждый раз и p rint новый идентификатор.

print(id(a.upper())) 
print(id(a.upper())) 

выход:

4372772488 
4372772376 

Это причина, почему "b".upper() is "B" # will return False. Потому что id не совпадает.

вы можете прочитать больше этих нитей:

why does comparing strings in python using either or is sometimes produce

understanding pythons is operator

Смежные вопросы