Уведомления

Группа в Telegram: @pythonsu

#1 Март 23, 2010 15:44:07

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

копирование экземпляра

Ну мне лично не известен способ изменить параметр внутри функции без return'a. К тому же это некрасиво и нечитабельно, а главное неявно, что в питоне вообще приследуется по закону :) Вы бы всетаки описали пролему целиком, форум вытерпит, поверте он и не такое терпел :) А то реально лень телепатировать :)



Офлайн

#2 Март 23, 2010 16:06:31

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

копирование экземпляра

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
так?



Офлайн

#3 Март 23, 2010 16:10:56

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

копирование экземпляра

Все объекты Питона являются ссылочными. Точка. Пожалуста, не путайте - потому что передача по значению предполагает копирование аргумента на стек (конструктор копирования, оператор присваивания и проч - помните?), чего никогда не происходит.

Сделать как в С++
void f(int& a, int& b); - нельзя.
Если вам так проще, в Питоне скорее будет что-то похожее на “просто С”
void f(int* a, int* b); - и никак иначе.



Офлайн

#4 Март 23, 2010 16:18:21

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

копирование экземпляра

Андрей Светлов
Все объекты Питона являются ссылочными. Точка. Пожалуста, не путайте
Прошу прощения, поросто поведение, при котором изменение параметра не сохраняется, для меня ассоциируется с передачей по значению (слишком много компилируемых языков изучал). Я вобщем-то про то, что переменные являются ссылочными знаю (я не верблюд :)), просто выразился неправильно.



Офлайн

#5 Март 23, 2010 16:31:34

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

копирование экземпляра

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

Топикстартер, тебя спросили что ты хочешь получить, а ты отвечаешь “в си всё просто - передал ссылку и п…ц”.
Неужели так сложно дать внятный ответ? Что ты хочешь получить как результат выполнения операции?

Я бы мог ответить на твой вопрос, но это долго обьяснять…



Офлайн

#6 Март 23, 2010 16:38:08

callret
От:
Зарегистрирован: 2007-12-24
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

копирование экземпляра

всем большое спасибо!

всё никак не выйдут из головы старые принципы



Офлайн

#7 Март 23, 2010 16:45:10

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

копирование экземпляра

dartNNN, действительно, передача параметра по значению - это довольно комплексный концепт. “Изменение параметра не сохраняется” - это лишь одно из его свойств. Если говорить точно, по значению передается PyObject*, а не сам PyObject. Разница, заметьте, существенная.



Офлайн

#8 Март 23, 2010 17:27:38

callret
От:
Зарегистрирован: 2007-12-24
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

копирование экземпляра

а дело собственно вот в чем:
имеются графические объекты с определенными свойствами (координаты, размер, и т.д.)
например нам нужно связать координаты (xy) некоторых объектов (o1 и o2) так, чтобы изменяя координаты одного - изменялись все связанные
за “связывание” должна отвечать определенная функция

каким красивым образом это решается?



Офлайн

#9 Март 23, 2010 22:47:57

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

копирование экземпляра

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)

Офлайн

#10 Март 23, 2010 23:07:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

копирование экземпляра

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)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version