Когда я передаю строку функции, python копирует всю строку в новую ячейку памяти или она ждет, пока я попытаюсь изменить строку внутри функции?Использует ли python copy-on-write при передаче неизменяемой переменной функции?
Спасибо :)
Когда я передаю строку функции, python копирует всю строку в новую ячейку памяти или она ждет, пока я попытаюсь изменить строку внутри функции?Использует ли python copy-on-write при передаче неизменяемой переменной функции?
Спасибо :)
Python не имеет только один экземпляр каждого неизменного объекта, независимо от того, сколько переменных вы со ссылкой на него. При использовании указанной строки в качестве аргумента другой функции вы передаете только эту ссылку. Когда вы говорите «модифицировать», что происходит, python просто меняет эту ссылку (также создавая новую строку, если она не использовалась arleady и, в конечном счете, удаляла старую, она не упоминается нигде).
Поскольку строки, как вы сказали, неизменяемы, вы не можете их модифицировать. если вы сделаете что-то вроде этого: a = "asd", b = a, b = "hohoho", a все равно будет "asd" – Dleep
Эмилиано Сорбелло, это не уникально для неизменяемых объектов вообще. Попробуйте его со списками, например. – Navith
Я знаю, я просто попытался уточнить свой ответ. если это не похоже на это, srry, мой английский немного груб вокруг краев – Dleep
Прошёл по ссылке (и вы должны использовать глобальные, чтобы изменить его внутри функции в области видимости правил):
In [31]: def t():
....: global s
....: print id(s)
....: s = 'foo'
....: print id(s)
....:
In [36]: s = 'spam'
In [37]: id(s)
Out[37]: 4471963392
In [38]: t()
4471963392
4467742200
Я настоятельно рекомендую прочитать [эту статью] (http://robertheaton.com/2014/ 02/09/pythons-pass-by-object-reference-as-explain-by-philip-k-dick /) полностью. –
См. Также один из [моих старых вопросов] (http://stackoverflow.com/questions/26587683/understanding-python-name-objects-immutable-data-and-memory-management). В комментариях есть много хорошей информации. –