Форум сайта python.su
Ну мне лично не известен способ изменить параметр внутри функции без return'a. К тому же это некрасиво и нечитабельно, а главное неявно, что в питоне вообще приследуется по закону :) Вы бы всетаки описали пролему целиком, форум вытерпит, поверте он и не такое терпел :) А то реально лень телепатировать :)
Офлайн
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
Офлайн
Все объекты Питона являются ссылочными. Точка. Пожалуста, не путайте - потому что передача по значению предполагает копирование аргумента на стек (конструктор копирования, оператор присваивания и проч - помните?), чего никогда не происходит.
Сделать как в С++
void f(int& a, int& b); - нельзя.
Если вам так проще, в Питоне скорее будет что-то похожее на “просто С”
void f(int* a, int* b); - и никак иначе.
Офлайн
Андрей СветловПрошу прощения, поросто поведение, при котором изменение параметра не сохраняется, для меня ассоциируется с передачей по значению (слишком много компилируемых языков изучал). Я вобщем-то про то, что переменные являются ссылочными знаю (я не верблюд :)), просто выразился неправильно.
Все объекты Питона являются ссылочными. Точка. Пожалуста, не путайте
Офлайн
Вероятно он хочет передать все параметры одного экземпляра класса другому экземпляру того же класса.
т.е. из примера си вызывается дефолтный, или определённый пользователем оператор класса присвоения. (хотя я си совсем не знаю)
Топикстартер, тебя спросили что ты хочешь получить, а ты отвечаешь “в си всё просто - передал ссылку и п…ц”.
Неужели так сложно дать внятный ответ? Что ты хочешь получить как результат выполнения операции?
Я бы мог ответить на твой вопрос, но это долго обьяснять…
Офлайн
всем большое спасибо!
всё никак не выйдут из головы старые принципы
Офлайн
dartNNN, действительно, передача параметра по значению - это довольно комплексный концепт. “Изменение параметра не сохраняется” - это лишь одно из его свойств. Если говорить точно, по значению передается PyObject*, а не сам PyObject. Разница, заметьте, существенная.
Офлайн
а дело собственно вот в чем:
имеются графические объекты с определенными свойствами (координаты, размер, и т.д.)
например нам нужно связать координаты (xy) некоторых объектов (o1 и o2) так, чтобы изменяя координаты одного - изменялись все связанные
за “связывание” должна отвечать определенная функция
каким красивым образом это решается?
Офлайн
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:13:33)
Офлайн
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>
>>>
Отредактировано (Март 23, 2010 23:14:09)
Офлайн