Найти - Пользователи
Полная версия: Передача по параметров по ссылке
Начало » Python для новичков » Передача по параметров по ссылке
1
Gradient
Не нашел подобной темы, удивился.

Как заставить питон “передавать параметры по ссылке”? Из документации я знаю, что все параметры - объекты и передаются исключительно по ссылке. Я хочу понять, как написать такое:

def f1(s):
r = s[:5]
s = s[5:]
return r

...

s = 'abcdefgh'
r = f1(s)
print(r)
print(s)

--- output ---
abcde
fgh
+ к сожалению, в моей питоньей справке (.chm) невозможно ничего найти: по любому запросу в search вываливаются все темы. Это “что-то не так” только с этим файлом. Для меня удивительно, но тем не менее, есть у кого идеи, что тут не так? (python262.chm, md5=45BFCC06114C84F7A33B48162945B041)
Ed
Так?
def f1(s):
return s[:5], s[5:]

s = 'abcdefgh'
r,s = f1(s)
Gradient
нет, s остаётся той же самой. А хорошо бы, чтобы менялась. Так, как вы написали, я пока сделал “чтоб работало”.

Как-то в питоне 3.1 я писал ref или что-то вроде того (не могу ни найти, ни вспомнить). Нужно такое решение (и чтобы работало в 2.6). Есть такое?
Ed
Gradient
нет, s остаётся той же самой. А хорошо бы, чтобы менялась.
По-моему вы хотите странного. Если в функцию передается ссылка, то можно менять не саму ссылку, а объект на который она ссылается.
По крайней мере в Си так.
Кроме того, в отличие от Си, в Питоне строки немодифицируемы. Используйте список, если нужно его модифицировать.
Dimka665
строка неизменяема.
Dimka665
и со списком такое не получится.
срез создает копию.
igor.kaist
global подойдет ?!
Но на самом деле, это не есть хорошо…
Griffon
Вообще можно врядли что так:
def egg(list_with_string):
r = list_with_string[0][:5]
list_with_string[0] = list_with_string[0][5:]
return r

s = ["my string"]
egg(s)
print s
Или написать класс строки самому. В таком случае строка будет изменяемой.
Но по-моему явное лучше неявного. Пример приведённый выше мне больше нравится.
Ed
Получится:
def f1(s):
r = s[:5]
s[:] = s[5:]
return r

s = list('abcdefgh')
r = f1(s)
print(''.join(r))
print(''.join(s))
Извращение, конечно, но работать будет.
Gradient
Остановился пока на виде
def f1(s)
r = s[:5]
s = s[5:]
return s, r

...

s, r = f1(s)
как на most-python-way решения. Такого, “как в классических языках”, не нашел, хотя очень искал.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB