Вначале в вопросе говорится, что строки неизменны, а затем запрашивается способ их изменения на месте.Это довольно противоречиво.В любом случае, так как этот вопрос появляется в верхней части списка, когда вы ищете «модификацию строки Python на месте», я добавляю ответ для реального изменения на месте.
Строки кажутся неизменнымикогда вы смотрите на методы класса строки.Но ни один язык с интерфейсом для C не может обеспечить неизменные типы данных.Вопрос только в том, нужно ли вам писать код на C, чтобы добиться желаемой модификации.
Здесь python ctypes
- ваш друг.Поскольку он поддерживает получение указателей и включает в себя функции копирования в C-образную память, строку Python можно изменить на месте следующим образом:
s = 16 * "."
print s
ctypes.memmove(ctypes.c_char_p(s), "Replacement", 11)
print s
Результат:
................
Replacement.....
(Конечно, вы можете вычислить замещающую строку во время выполнения, применяя функцию F
к каждому символу исходной строки. Различные способы, как это сделать, были показаны в предыдущих ответах.)
Обратите внимание, что я никоим образом не поощряю это делать.Однако мне пришлось написать замену для класса, который был сопоставлен с C ++ на python и включил метод:
int readData(char* data, int length)
(вызывающий должен обеспечить память length
байтами, а затем метод записываетдоступные данные - до length
- в эту память, возвращающие количество записанных байтов.) Хотя это очень разумный API в C / C ++, его не следует делать доступным в качестве метода класса Python илипо крайней мере, пользователи API должны знать, что они могут передавать только изменяемые байтовые массивы в качестве параметра.
Как и следовало ожидать, «общее использование» метода такое, как показано в моем примере (создайте строку и передайте ее вместе с ее длиной в качестве аргументов).Поскольку я действительно не хотел писать расширение C / C ++, мне пришлось придумать решение для реализации поведения в моем классе замещения с использованием только Python.