Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 2, 2009 10:02:58

Gradient
От:
Зарегистрирован: 2009-06-03
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

Не нашел подобной темы, удивился.

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

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)



Офлайн

#2 Окт. 2, 2009 10:28:16

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

Так?

def f1(s):
return s[:5], s[5:]

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



Офлайн

#3 Окт. 2, 2009 11:07:50

Gradient
От:
Зарегистрирован: 2009-06-03
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

нет, s остаётся той же самой. А хорошо бы, чтобы менялась. Так, как вы написали, я пока сделал “чтоб работало”.

Как-то в питоне 3.1 я писал ref или что-то вроде того (не могу ни найти, ни вспомнить). Нужно такое решение (и чтобы работало в 2.6). Есть такое?



Офлайн

#4 Окт. 2, 2009 11:33:48

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

Gradient
нет, s остаётся той же самой. А хорошо бы, чтобы менялась.
По-моему вы хотите странного. Если в функцию передается ссылка, то можно менять не саму ссылку, а объект на который она ссылается.
По крайней мере в Си так.
Кроме того, в отличие от Си, в Питоне строки немодифицируемы. Используйте список, если нужно его модифицировать.



Отредактировано (Окт. 2, 2009 11:34:25)

Офлайн

#5 Окт. 2, 2009 11:58:40

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

строка неизменяема.



Офлайн

#6 Окт. 2, 2009 12:03:18

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

и со списком такое не получится.
срез создает копию.



Офлайн

#7 Окт. 2, 2009 12:18:58

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

global подойдет ?!
Но на самом деле, это не есть хорошо…



Отредактировано (Окт. 2, 2009 12:20:34)

Офлайн

#8 Окт. 2, 2009 12:47:24

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

Вообще можно врядли что так:

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
Или написать класс строки самому. В таком случае строка будет изменяемой.
Но по-моему явное лучше неявного. Пример приведённый выше мне больше нравится.



Отредактировано (Окт. 2, 2009 12:52:51)

Офлайн

#9 Окт. 2, 2009 12:52:22

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

Получится:

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

s = list('abcdefgh')
r = f1(s)
print(''.join(r))
print(''.join(s))
Извращение, конечно, но работать будет.



Офлайн

#10 Окт. 5, 2009 09:50:01

Gradient
От:
Зарегистрирован: 2009-06-03
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача по параметров по ссылке

Остановился пока на виде

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

...

s, r = f1(s)
как на most-python-way решения. Такого, “как в классических языках”, не нашел, хотя очень искал.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version