dartNNN
Март 23, 2010 15:44:07
Ну мне лично не известен способ изменить параметр внутри функции без return'a. К тому же это некрасиво и нечитабельно, а главное неявно, что в питоне вообще приследуется по закону :) Вы бы всетаки описали пролему целиком, форум вытерпит, поверте он и не такое терпел :) А то реально лень телепатировать :)
pasaranax
Март 23, 2010 16:06:31
callret
мне нужно чтоб ф-я изменяла экземпляры, которые ей передаются
class A:
def __init__(self):
self.param = 1
def changeParam(a):
a.param = 2
a = A()
print a.param
changeParam(a)
print a.param
так?
Андрей Светлов
Март 23, 2010 16:10:56
Все объекты Питона являются ссылочными. Точка. Пожалуста, не путайте - потому что передача по значению предполагает копирование аргумента на стек (конструктор копирования, оператор присваивания и проч - помните?), чего никогда не происходит.
Сделать как в С++
void f(int& a, int& b); - нельзя.
Если вам так проще, в Питоне скорее будет что-то похожее на “просто С”
void f(int* a, int* b); - и никак иначе.
dartNNN
Март 23, 2010 16:18:21
Андрей Светлов
Все объекты Питона являются ссылочными. Точка. Пожалуста, не путайте
Прошу прощения, поросто поведение, при котором изменение параметра не сохраняется, для меня ассоциируется с передачей по значению (слишком много компилируемых языков изучал). Я вобщем-то про то, что переменные являются ссылочными знаю (я не верблюд :)), просто выразился неправильно.
Griffon
Март 23, 2010 16:31:34
Вероятно он хочет передать все параметры одного экземпляра класса другому экземпляру того же класса.
т.е. из примера си вызывается дефолтный, или определённый пользователем оператор класса присвоения. (хотя я си совсем не знаю)
Топикстартер, тебя спросили что ты хочешь получить, а ты отвечаешь “в си всё просто - передал ссылку и п…ц”.
Неужели так сложно дать внятный ответ? Что ты хочешь получить как результат выполнения операции?
Я бы мог ответить на твой вопрос, но это долго обьяснять…
callret
Март 23, 2010 16:38:08
всем большое спасибо!
всё никак не выйдут из головы старые принципы
Андрей Светлов
Март 23, 2010 16:45:10
dartNNN, действительно, передача параметра по значению - это довольно комплексный концепт. “Изменение параметра не сохраняется” - это лишь одно из его свойств. Если говорить точно, по значению передается PyObject*, а не сам PyObject. Разница, заметьте, существенная.
callret
Март 23, 2010 17:27:38
а дело собственно вот в чем:
имеются графические объекты с определенными свойствами (координаты, размер, и т.д.)
например нам нужно связать координаты (xy) некоторых объектов (o1 и o2) так, чтобы изменяя координаты одного - изменялись все связанные
за “связывание” должна отвечать определенная функция
каким красивым образом это решается?
knkd
Март 23, 2010 22:47:57
callret
имеются графические объекты с определенными свойствами (координаты, размер, и т.д.)
Так храните ссылки на них в контейнерном классе и изменяйте через его методы. В чём проблема?
In [0]: class Point:
.....: def __init__(self, x, y, z):
.....: self.x = x
.....: self.y = y
.....: self.z = z
.....:
.....: def __str__(self):
.....: res = "Point( X = {0}, Y = {1}, Z = {2} )".format(self.x, self.y, self.z)
.....: return res
In [1]: class PointGroup:
....: def __init__(self, *args):
....: self.group = list(args)
....:
....: def add_point(self, point):
....: self.group.append(point)
....:
....: def shift_point(self, dX, dY, dZ):
....: for point in self.group:
....: point.x += dX
....: point.y += dX
....: point.z += dZ
....:
In [3]: pg = PointGroup()
In [4]: for x in xrange(1000):
.....: y = x**2
.....: z = x**3
.....: point = Point(x, y, z)
.....: pg.add_point(point)
.....:
In [5]: pg.shift(1, 2, 3)
Как-то так.
Андрей Светлов
Март 23, 2010 23:07:53
callret, а прямо в лоб не пробовали? Вам же нужны не “связанные”, а “единые” координаты.
>>> class Coord(object):
... x = 0
... y = 0
...
... def __repr__(self):
... return "<%s, %s>" % (self.x, self.y)
...
>>> class Box(object):
... def __init__(self):
... self.center = Coord()
...
...
>>> class Circle(object):
... def __init__(self):
... self.center = Coord()
...
>>> b = Box()
>>> b.center
<0, 0>
>>> c = Circle()
>>> c.center
<0, 0>
>>> b.center.x = 10
>>> b.center
<10, 0>
>>> c.center
<0, 0>
>>> c.center = b.center
>>> c.center
<10, 0>
>>> b.center.y = 5
>>> c.center
<10, 5>
>>>