Pull to refresh

Comments 10

Погуглил: для строк в Питоне (как и в Java) есть явный вызов «intern», который позволяет потом предсказуемо сравнивать такие строки по ссылке.

Да, совершенно верно:

>>> import sys
>>> a = "hello!"
>>> b = "hello!"
>>> a is b
False
>>> a = sys.intern("hello!")
>>> b = sys.intern("hello!")
>>> a is b
True

Но для этого необходимо явно интернировать строки

Ну да. А тех, кто их сравнивает на «is» (или на == в Java) без предварительного интернирования, необходимо больно бить по рукам.

Впрочем, такое сравнение строк – довольно экзотическая процедура (зачем-то понадобилось резко ускорить сравнение). По сути, это случай, когда строка используется в качестве символа (токена). Обычно для таких случаев вообще удобно завести мапу, которая преобразует строку в значение из enum.
Блин, картинка из под ката не оказалась в самой статье пришлось возвращаться %) ненадо так…
с картинки:
290 is 290 #False

Это же не верно. Я только из за этого и зашел, думал будет тут)) да и всё остальное тоже true.
Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> 290 is 290
True
>>> a, b = "hi", "hi"
>>> a is b
True
>>> a == b
True


Но это так, чисто к самой картинке, а не к статье.

def test_str():

было бы нагляднее не результат выводить отдельным блоком, а прямо там как и положено в тестах, выполнять проверку со значением которое должно. Вывод результатов отдельно хорошо, но так, сразу во время просмотра кода было бы понятно. Можно было сразу в pytest завернуть всё)

Картинка - просто кликбейт, за это извиняюсь!
Про вывод учту) Сначала думал, делать вывод под каждой строчкой с принтом, но потом решил оставить всё же блоками
В следующий раз постараюсь аккуратнее сделать!

И этот язык используется для обучения?

// Где ты старый добрый Perl?

Думаю, что в период обучения мало кто сталкивается с такими нюансами языка
Но я не завидую тем новичкам, которые все же сталкиваются с такими моментами в питоне, а потом сидят и понять не могут, почему же оно работает не так, как должно)

Не особенно понятно, кто вообще в здравом уме будет сравнивать строки оператором is? Кто-то знаком с подобной практикой? Я вот сколько кода не смотрел, и профессионального и индусского, не припомню, чтобы такое видел. А в таком случае для чего подобное исследование? Это все равно, что разбираться, почему сравнение строк на C нельзя выполнять сравнением указателей. Но никто для этой цели на сях и не делает типа

s1 = s2 = "hello";
if (&s1 == &s2) { ... }

Ибо, как говорится, на что козе укулеле?

это же стандартное нытьё про питон. из заметки в заметку перечень начинается с попытки сравнения значения строк через сравнение объектов. а потом ещё куча глупых вещей.

Sign up to leave a comment.

Articles