В Python строки неизменны.Вы передаете функции onerand
строку, имя аргумента packet
, копируете ее, давая локальное имя pack
(все еще строка, поэтому неизменяемая), затем вы пытаетесь сделать
pack[whatever] = byte
Индекс не имеет значения: вы пытаетесь изменить неизменяемую строку.Вот что говорит вам сообщение об ошибке, настолько ясно, насколько это возможно, мне кажется: вы не можете этого сделать.
Я не хочу разбивать в массиве все байты
Ну, конечно, вы не можете использовать строку , если вам нужно назначить некоторые из них.Что ты имеешь против массивов?import array
, используйте pack = array.array('c', packet)
вместо pack = packet[:]
и живите долго и счастливо - array.array
очень компактен и быстр, и тоже изменчив!
Отредактируйте : вы могли бы сделать это со списком, как в принятом ответе, но это только при действительно высоких относительных затратах в производительности.Рассмотрим, например:
$ py26 -mtimeit -s's="".join([str(x)[0] for x in range(99)]); import array
> ' 'a=array.array("c",s); a[23]="b"; b=a.tostring()'
1000000 loops, best of 3: 1.09 usec per loop
$ py26 -mtimeit -s's="".join([str(x)[0] for x in range(99)]); import array
> ' 'a=list(s); a[23]="b"; b="".join(a)'
100000 loops, best of 3: 7.68 usec per loop
A list
- это гораздо более общая структура, чем array.array
, которая вам здесь действительно нужна, откуда более чем в семь раз замедляется выбор неправильной структуры данных,(В Python 2.7 это менее страшно, «всего лишь» в 4 раза медленнее - но подумайте, сколько будет стоить вам купить машину в четыре раза быстрее, чем ваша нынешняя, и, возможно, вы согласитесь, что даже ускорение«просто» 4+ раза, а не 7+, все еще является хорошим побочным продуктом; -).