Python: Как передать строку по ссылке?

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

Ответ 1

Python не делает копии объектов (включая строки) переданным функциям:

>>> def foo(s):
...     return id(s)
...
>>> x = 'blah'
>>> id(x) == foo(x)
True

Если вам нужно "изменить" строку в функции, верните новую строку и верните ее в исходное имя:

>>> def bar(s):
...     return s + '!'
...
>>> x = 'blah'
>>> x = bar(x)
>>> x
'blah!'

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

Ответ 2

Просто передайте его, как и любой другой параметр. Содержимое не будет скопировано, будет только ссылка.

Ответ 3

In [7]: strs="abcd"

In [8]: id(strs)
Out[8]: 164698208

In [9]: def func(x):
    print id(x)
    x=x.lower() #perform some operation on string object, it returns a new object
    print id(x)
   ...:     

In [10]: func(strs)
164698208              # same as strs, i.e it actually passes the same object 
164679776              # new object is returned if we perform an operation
                       # That why they are called immutable  

Но операции с строками всегда возвращают новый строковый объект.

Ответ 4

def modify_string( t ):
  the_string = t[0]
  # do stuff

modify_string( ["my very long string"] )