Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Иммутабильность строк, Это баг или фича? 
:(
    Опции темы
ToshaCh
Дата 10.5.2012, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 555
Регистрация: 10.11.2005
Где: Москва, РФ

Репутация: нет
Всего: 26



Код

>>> string1 = '11111'
>>> string1 = '22222'
>>> string1
22222
>>> 
>>> string1[2]='3'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> string1=string1[:2]+'3'+string1[3:]
>>> string1
'22322'

    Простой пример из которого видно:
  •  что строки нельзя менять непосредственно;
  •  операции над строками идут через ссылки - иначе не объяснить почему второе выражение сработало, а четвертое нет;
  •  из этого следует интерестный вывод: за время моих упраженеий я неявным образом наплодил 3 строки, хотя работал вроде как с одной и непонятно кто и когда их подчистит

Собственно зачем так сделано и почему эта явно функциональная черта есть только у строк, а, например, числа не обладают этим свойством? Ну и вечный вопрос, что делать. Очевидно, что нужно менять подход к программированию, но как? Т.е. предпологается, что работая со строками я должен исповедовать функциональные подходы, а с числами можно и традиционные?






--------------------
Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 
--
Oracle это не только способ отмывания денег, но и вполне себе преличная база данных.
PM MAIL Jabber   Вверх
Ch0bits
Дата 10.5.2012, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Позиционируют как фичу smile

Цитата

Notice that in the prior examples, we were not changing the original string with any of the operations we ran on it. Every string operation is defined to produce a new string as its result, because strings are immutable in Python—they cannot be changed in-place after they are created. For example, you can’t change a string by assigning to one of its positions, but you can always build a new one and assign it to the same name. Because Python cleans up old objects as you go (as you’ll see later), this isn’t as inefficient as it may sound:

  >>> S
  'Spam'
  >>> S[0] = 'z'             # Immutable objects cannot be changed 
  ...error text omittted...
  TypeError: 'str' object does not support item assignment


Learning Python, Third Edition, written by Mark Lutz (O'Reilly, 2008; ISBN: 0596513984). Copyright © 2008 O'Reilly Media

Цитата(ToshaCh @  10.5.2012,  17:25 Найти цитируемый пост)
Ну и вечный вопрос, что делать. Очевидно, что нужно менять подход к программированию, но как? Т.е. предпологается, что работая со строками я должен исповедовать функциональные подходы, а с числами можно и традиционные?

По моему проблемы нет и поведение вполне логичное. Ты ведь не можешь обратиться к числу через индексатор, а для строки это просто удобно.

Самый большой баг Python 2, наверно то что функция strftime() уже 10 лет не может работать с датами меньше 1900 года  smile 

Это сообщение отредактировал(а) Ch0bits - 10.5.2012, 19:30
PM WWW   Вверх
ToshaCh
Дата 11.5.2012, 13:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 555
Регистрация: 10.11.2005
Где: Москва, РФ

Репутация: нет
Всего: 26



Нашел интерестную ссылку по этому поводу: http://effbot.org/pyfaq/why-are-python-strings-immutable.htm

Цитата

Why are Python strings immutable?

There are several advantages.

One is performance: knowing that a string is immutable makes it easy to lay it out at construction time — fixed and unchanging storage requirements. This is also one of the reasons for the distinction between tuples and lists. This also allows the implementation to safely reuse string objects. For example, the CPython implemenation uses pre-allocated objects for single-character strings, and usually returns the original string for string operations that doesn’t change the content.

The other 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.

CATEGORY: general design
 

Comment:

The use of immutable data structures (strings, tuples) enforce a non-side-effects style of programming. In a function, you receive data, create new objects, and return, not modifying things "in place". Well, side effects must be done some time, like switching through states in a object, but it is better done in the "extremes" of your logic. It is a whole philosophy to make code more composable and independent of context.

Posted by Eduardo O Padoan (2006-11-16)


Т.е. всеже на питоне рекомендуется писать как на функциональном языке. 


--------------------
Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 
--
Oracle это не только способ отмывания денег, но и вполне себе преличная база данных.
PM MAIL Jabber   Вверх
Karadul
Дата 14.5.2012, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Только неизменяемые типы могут применяться как ключи в хеш-массивах.

Если тебе по каким-то причинам нужен изменяемый буфер (например, для I/O), юзай bytearray() (c 2.6)
Код

>>> a=bytearray('123')
>>> a
bytearray(b'123')
>>> a[2]=1
>>> a
bytearray(b'12\x01')
>>> a[2]="1"
>>> a
bytearray(b'121')


Добавлено через 1 минуту и 12 секунд
Цитата(ToshaCh @  10.5.2012,  17:25 Найти цитируемый пост)
а, например, числа не обладают этим свойством?

А где оно у чисел?
PM MAIL   Вверх
ToshaCh
Дата 18.5.2012, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 555
Регистрация: 10.11.2005
Где: Москва, РФ

Репутация: нет
Всего: 26



Цитата(Karadul @  14.5.2012,  09:24 Найти цитируемый пост)
А где оно у чисел? 

Да я уже понял, что с числами таже самая петрушка. Забавные язык этот питон. 


--------------------
Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 
--
Oracle это не только способ отмывания денег, но и вполне себе преличная база данных.
PM MAIL Jabber   Вверх
Karadul
Дата 18.5.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Цитата(ToshaCh @  18.5.2012,  11:48 Найти цитируемый пост)
Забавные язык этот питон.  

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

Это сообщение отредактировал(а) Karadul - 18.5.2012, 15:08
PM MAIL   Вверх
ToshaCh
Дата 18.5.2012, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 555
Регистрация: 10.11.2005
Где: Москва, РФ

Репутация: нет
Всего: 26



Цитата(Karadul @  18.5.2012,  15:07 Найти цитируемый пост)
Привыкай, такой подход во всех высокоуровневых языках - а не высокоуровневые - это си и асм


Это в каких таких всех? В каком это языке не сработает string1[2]='3'? Кроме функциональных, разумеется.

Это сообщение отредактировал(а) ToshaCh - 18.5.2012, 17:35


--------------------
Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 
--
Oracle это не только способ отмывания денег, но и вполне себе преличная база данных.
PM MAIL Jabber   Вверх
Karadul
Дата 18.5.2012, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



В яве точно не сработает. Сработает в перле. С другой стороны, я не знаю, что будет, если попытаться записать больше или меньше символов/байтов в середину оригинала, чем там было.
А в каких еще сработает?

В высокоуровневых языках есть собстенно строки - обычно неизменяемые, ибо иначе не получится использовать их как ключ в хеш-массивах, и изменяемые буферы, в яве, как и в си, это массивы, в питоне -  bytearray()
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1205 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.