2013-04-03 4 views
5

Во-первых, обратите внимание, что я понимаю, что == используется для сравнения двух выражений, а = используется для назначения значения переменной. Тем не менее, python - это такой чистый язык с минимальными требованиями к синтаксису, который кажется простым оператором для топора. Также я не пытаюсь начать дискуссию или дискуссию, а скорее узнаю, есть ли что-то, чего я не хватаю, чтобы улучшить свои знания в программировании.

Точно так же (в python) нам не нужно объявлять переменную как int или строку, а язык определяет это на основе назначенного значения, почему оператор «if» просто не определяет, что = - сравнение, а не задание?

Другим примером является то, что python избавился от многих {} и [] на других языках и просто использовал отступ, потому что отступы и использование фигурных скобок являются излишними. Мне кажется, что if foo == goo: также избыточен. Но, возможно, есть кое-что, о чем я еще не знаю. Отсюда вопрос!Какова цель оператора '==' при сравнении значений vs '='?

+0

Это смешно, потому что я только что видел это видео: [Интервью с Тимом Петерсом] (http://www.youtube.com/watch?v=1wAOy88WxmY), где он сказал, что начал работать с Python 0.9.1, где ' = 'знак фактически использовался как для сравнения, так и для назначения – jamylak

+0

Теперь мне нужно посмотреть, что один ... Я не знал, что это когда-либо было. Конечно, когда я начал работать с python, мы были на python2.6 ... С тех пор не изменилось многого (python3.something уже вышел ...) – mgilson

ответ

11

Один очень простая причина, что питон позволяет логические выражения:

a = b == c 

, а также множественное присваивание:

a = b = c 

В первом случае a получает присваивается логическое значение * (True или False) в зависимости от того, являются ли b и c равными. Во втором случае a и b в конечном итоге ссылаются на один и тот же объект (c). Очевидно, что вы не можете поддерживать как один оператор.

Я полагаю, что вы могли бы (в принципе) перегружать = только в if отчетности (поскольку уступка не пускают), но это было бы запутаться - особенно для людей, приезжающих из C где an assignment is allowed in an if statement. Чаньской снова побеждает (» Явный лучше, чем неявный »).


  • Это на самом деле не должно быть логическое значение. Это на самом деле все, что возвращается a «s __eq__ метод (или b» s __eq__ если бывший возвращается NotImplemented) - наиболее объекты возвращают логическое значение, но некоторые из них не (numpy.ndarray один общий объект, который имеет __eq__ который возвращает другой ndarray, например).
+2

В этом смысле одна строка, содержащая 'b == c' будет делать полное заявление, и, конечно же, это отличается от 'b = c'. +1 – heltonbiker

+0

Спасибо. Имеет смысл. И я согласен, вы бы не хотели изменять его только для операторов. Это противоречит основополагающему принципу поддержания целостности питона. – user2218093

+0

@heltonbiker - Это полностью допустимая точка, особенно из интерактивного приглашения, где 'b == c' - это то же самое, что и' print repr (b == c) '. И, конечно же, давайте не будем забывать, что из-за динамического характера python трудно понять, что 'b' и' c' находятся во время выполнения. У одного из них может быть действительно напуганное '__eq__' с побочными эффектами или еще что-то, поэтому выражение' b == c' может (в принципе) быть «полезным», даже если вы не находитесь в интерактивном приглашении. – mgilson

5

Эти два оператора могут перекрываться. Например, рассмотрим

a = b = c 

который устанавливает a и b как к c и

a = b == c 

который устанавливает a либо True или False на основе ли b и c равны.


В более общем плане, Python пытается избежать синтаксис, даже, возможно, неоднозначны, чтобы позволить анализатору быть проще. Даже если двусмысленность выше может быть решена, это будет связано с добавлением ряда особых случаев и, как правило, сложностью для анализатора. Непосредственное разделение этих двух операторов позволяет избежать проблемы.

+0

Спасибо. Имеет смысл. – user2218093

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