2015-05-15 1 views
1

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

Спасибо :)

+0

Я настоятельно рекомендую прочитать [эту статью] (http://robertheaton.com/2014/ 02/09/pythons-pass-by-object-reference-as-explain-by-philip-k-dick /) полностью. –

+0

См. Также один из [моих старых вопросов] (http://stackoverflow.com/questions/26587683/understanding-python-name-objects-immutable-data-and-memory-management). В комментариях есть много хорошей информации. –

ответ

3

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

+0

Поскольку строки, как вы сказали, неизменяемы, вы не можете их модифицировать. если вы сделаете что-то вроде этого: a = "asd", b = a, b = "hohoho", a все равно будет "asd" – Dleep

+0

Эмилиано Сорбелло, это не уникально для неизменяемых объектов вообще. Попробуйте его со списками, например. – Navith

+0

Я знаю, я просто попытался уточнить свой ответ. если это не похоже на это, srry, мой английский немного груб вокруг краев – Dleep

0

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

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 

 Смежные вопросы

  • Нет связанных вопросов^_^