Использует ли python копирование при записи при передаче неизменяемой переменной в функцию?

Когда я передаю строку функции, python копирует всю строку в новое место в памяти или ждет, пока я не попытаюсь изменить строку внутри функции?

Спасибо :)


person user3043893    schedule 15.05.2015    source источник
comment
Я настоятельно рекомендую прочитать эту статью целиком.   -  person Rick supports Monica    schedule 16.05.2015
comment
См. также один из моих старых вопросов. Там в комментариях много полезной информации.   -  person Rick supports Monica    schedule 16.05.2015


Ответы (2)


В Python есть только одна копия каждого неизменяемого объекта, независимо от того, сколько переменных вы на него ссылаетесь. При использовании указанной строки в качестве аргумента другой функции вы только передаете ей эту ссылку. Когда вы говорите «изменить», происходит то, что python просто меняет эту ссылку (также создает новую строку, если она не использовалась ранее, и в конечном итоге удаляет старую, на которую больше нигде не ссылается).

person Dleep    schedule 15.05.2015
comment
Поскольку строки, как вы сказали, неизменяемы, вы не можете их изменить. если вы сделаете что-то вроде этого: a = asd, b = a, b = хохохо, a все равно будет asd - person Dleep; 16.05.2015
comment
Эмилиано Сорбелло, это вовсе не уникально для неизменяемых объектов. Попробуйте, например, со списками. - person Navith; 16.05.2015
comment
Я знаю, я просто попытался уточнить свой ответ. если это не показалось, извините, мой английский немного грубоват по краям - person Dleep; 16.05.2015

Передается по ссылке (и вы должны использовать global, чтобы изменить его внутри функции в соответствии с правилами области видимости):

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
person salparadise    schedule 15.05.2015