2012-11-28 2 views
11

С этой ссылкой: How do I pass a variable by reference?, мы знаем, что Python скопирует строку (неизменяемую переменную типа), когда она передается функции как параметр, но я думаю, что она потеряет память, если строка огромна. Во многих случаях нам нужно использовать функции для переноса некоторых операций для строк, поэтому я хочу знать, как сделать это более эффективным?Python: Как передать строку по ссылке?

+0

Я не уверен, что вы здесь просите ... у вас есть код, который демонстрирует проблему, с которой вы сталкиваетесь? –

+0

> Мы знаем, что Python скопирует строку (неизменяемую переменную типа), когда она передается функции как параметр. Вы, конечно же, не знаете этого! Python никогда ничего не копирует. –

ответ

18

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!' 

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

+0

Python никогда не проходит по ссылке. Он передает ссылки, но «pass by reference» уже используется для другого стиля передачи аргументов (который позволяет, например, использовать функцию swap (a, b) »). – delnan

+0

@ delnan: Точка взята. Как бы вы это ни называли, Python не копирует объекты, на которые ссылаются имена, когда они назначены аргументам. –

+1

Абсолютно. Это просто терминология, которая является проблематичной. То же самое касается других случаев назначения и для других объектов, поэтому вы можете обобщить свой ответ. – delnan

2

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

2
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's why they are called immutable 

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

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

modify_string(["my very long string"]) 
Смежные вопросы