Another advantage is that strings in Python are considered as “elemental” as numbers. No amount of activity will change the value 8 to anything else, and in Python, no amount of activity will change the string “eight” to anything else.
они чо, тупые? модифицируется не literal constant, а переменная.
Короче, проще говоря в контексте Пистона: «Потому что и точка!». Я вот не понимаю, когда они пишут про производительность, то каким образом она просядет, если я например в 10 символьной строке поменяю пару символов по их индексу? (ну типа как в С). Такое ощущение, что изначально поленились сделать нормально, а теперь уже и смысла нет, т.к. тонны кода уже написаны и без этого.
В хачкеле дефолтные строки, тип String, тоже определены как список символов ([Char] или как-то так). Но почему-то эти дефолтные строки годны только в хелловорлдах, а на деле используются ByteString. Тож поддались влиянию влиянию новомодных язычков, поди.
самое забавное, что изменение символа в строке — это O(1). а вот если ради этого заменять её на другую, то это унутре как минимум новый аллок. перфоманс такой перфоманс.
ну так-то да. вот в нормальном языке Vala, например, несмотря на наличие современного подсчёта ссылок, всё равно можно взять указатель и делать с ним что угодно. вот это называется гибкость. а выпиливание ради выпиливания, потому что это «несовременно» — самый настоящий регресс.
Иммутабельность чего-угодно — это удобно. Из-за мутабельности списков в том же питоне приходится следить за тем, чтобы случайно не изменить чужой список.
Так их проще «шарить», можно использовать ссылку на один и тот же экземпляр и не переживать про CoW. В общих случаях это действительно оптимизация. Хотя и затык в других.
В питоне понятие «переменная» отличается от такового в языках уровня си.
Когда в питоне пишешь foo = bar, то это не операция над foo, а операция над текущим пространством имён — присвоение в пространстве имён имени foo объекту bar.
Ты про то что на питоне нет смысла писать многопоточные программы? Есть реализации питона без GIL. Есть greenlets. И если не нагружать питон cpu-intensive work, то и с потоками можно жить.
ты про иммутабельность? причина в том, что такие алгоримты обработки таких строк плохо расспараллеливаются.
и кстати, это давным-давно пошло — Objective C современник С++, не говоря уже о лиспах где со строками можно было работать как с интернированными символами (правда добровольно, а не добровольно-принудительно)
В нормальных языках для обмазывания байтами есть байтовые массивы. А строки не меняются, чтобы ты не смог отстрелить себе киль.
самое забавное, что изменение символа в строке — это O(1). а вот если ради этого заменять её на другую, то это унутре как минимум новый аллок. перфоманс такой перфоманс.
Самое забавное, что менять строки не нужно от слова вообще. И твой О(1) - всё еще пустая трата электрического тока.
https://bugs.ruby-lang.org/issues/11473 Matz said «All String literals are immutable (frozen) on Ruby 3». This ticket is place holder to discuss about that.
В тикете обсуждение +/- опциональности, magic comments и других подходов. Так же ссылки на другие обсуждения. Можно вдовль обмазаться доводами за и против. Может на целый пакет хватит для сегодняшней ванны.
Потому что встроенные в языки «строки» - это минимум, чтоб былО. Тебе ведь никто не мешает замутить свой собственный строковый тип с мутабельностью и CoW.
самое забавное, что изменение символа в строке — это O(1). а вот если ради этого заменять её на другую, то это унутре как минимум новый аллок. перфоманс такой перфоманс.