Найти - Пользователи
Полная версия: Непосредственное изменение аргументов функции
Начало » Python для экспертов » Непосредственное изменение аргументов функции
1
denz
Я знаю что это не “по питонически”, но в полный рост встал вопрос:
Возможно ли в питоне работать с переданным методу аргументом, а не с его копией?
например

def incrementor(self,val):
val+=1

if __name__==“__main__”:
a=21
incrementor(a)
#вариант вида а=incrementor(a) с использованием return в методе incrementor не подходит. Честное слово.
print a

Нужно чтобы печатало 22 :)

Как передать методу переменную, а не ее копию?
В С это решается указателями, и в принципе можно подцепить нужный модуль к питону, но у меня с указателями плохие ассоциации :/
Кроме того, ощущивается что должно быть более прямое решение с помощью родных возможностей языка.
Заранее спасибо за любой ответ, совет, линк или критику.
denz
Вообще в данном конкретном случае это обходится, но на первых этапах вопрос встал, и теперь (на будущее) интересно, насколько такое возможно. Прекрасно понимаю что это кривой путь.
Пока описывал существующую задачу понял что мне пора в отпуск :) потому что все совсем просто :)

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

Решается запуском нескольких Thread - для каждого из битов.
Но общее решение первой задачи (или намеки на общее решение) всеравно было б интересно :)
masai
denz
def incrementor(self,val):
val+=1

if __name__==“__main__”:
a=21
incrementor(a)
#вариант вида а=incrementor(a) с использованием return в методе incrementor не подходит. Честное слово.
print a
Построчное выполнение программы.

a = 21
Создается ссылка a на объект типа int, инициальзированный числом 21.

    incrementor(a)
def incrementor(self,val):

Создается ссылка val, указывающая туда же, куда указывает a.

         val+=1
То же, что val = val + 1 или val = val.__add__(1)
val теперь указывает на объект типа int, инициализированный числом val+1, так как __add__ возвращает новый объект. Естественно, исходный объект не меняется.

В том, что создается новый объект, легко убедиться:
x = 1
print id(x)
x += 1
print id(x)

Как видно, ID не совпадают.
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