По-видимому, существует почти философское различие в значении "равенства" между C++ и Python. Я узнал об этом различии, пытаясь сделать на Python что-то, что довольно сложно в C++: различать два типа перечислений, когда они оба являются просто оболочкой для набора целых чисел, но проблема шире, чем перечисления, следовательно настоящий вопрос.
Если я пишу в коде C++, например, следующее
#include <iostream>
struct Foo {
bool operator==(const Foo& foo) const { return this == &foo; }
};
struct Bar {};
int main() {
Foo foo = Foo();
Bar bar = Bar();
if (foo == bar) std::cout << "ok" << std::endl;
}
Я полностью ожидаю, что сравнение равенства потерпит неудачу. Действительно, это ошибка компиляции. Вы даже не можете сравнивать два объекта, если только они не хотят, чтобы их происходило, одного типа.
И все же кажется, что " в Python существует небольшой (нет?) Прецедент для сопоставления равенств, вызывающих ошибки ".
Действительно, писать
class Foo(object):
pass
class Bar(object):
pass
foo = Foo()
bar = Bar()
if (foo == bar):
print("equal")
показывает, что нет никакой проблемы при сравнении объектов, которые в противном случае были бы несравнимы.
Что, философски, является корнем этого различия в смысле равенства между двумя языками?
Обновить
Часть моего недоумения в том, чтобы разобраться с Python, заключается в том, что до сих пор каждая функция, по-видимому, была разработана с намерением быть "естественным", "интуитивным", даже "человеческим", а не тем, что они могут быть определены в первую очередь.
Но подумайте, что вы находитесь в секции фруктов в продуктовом магазине и спрашиваете одного из первопроходцев: "Не могли бы вы рассказать мне, являются ли эти апельсины Fuji или Red Delicious?" Разумеется, никто не мог бы понять вопрос, чтобы венчать ответ так или иначе. Поэтому вопрос заключается в том, как обеспечить ответ "недоверчивым" в битах и байтах.
Обновление 2
(Слишком долго, чтобы быть комментарием к комментарию @GiacomoAlzetta) Я уважаю ваше мнение. Тем не менее, с этого момента я не буду уважать книгу о Python, которая не посвящает главу или, по крайней мере, раздел, указывая, что 3 < [1]
является Истиной, и это объясняет предысторию (будь то историческая или философская ) за это. Быть динамически типизированным не означает, что человек настолько сильно загнан в угол (потому что, например, у одного есть только несколько доступных имен "a", "b" и "c"), чтобы повторно использовать имя для совершенно другого значения. В конечном счете, это даже не философская, а инженерная проблема: как вы удаляете или, по крайней мере, уменьшаете вероятность того, что один из нескольких людей, сотрудничающих с программным проектом, будет вводить ошибки в систему? Ошибки, которые остаются бездействующими (потому что язык динамически типизирован, и мы не можем предсказать пути вычислений) намного хуже ошибок, которые кричат "ошибка".