Найти - Пользователи
Полная версия: копирование экземпляра
Начало » Python для новичков » копирование экземпляра
1 2 3
dartNNN
Ну мне лично не известен способ изменить параметр внутри функции без return'a. К тому же это некрасиво и нечитабельно, а главное неявно, что в питоне вообще приследуется по закону :) Вы бы всетаки описали пролему целиком, форум вытерпит, поверте он и не такое терпел :) А то реально лень телепатировать :)
pasaranax
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
Андрей Светлов
Все объекты Питона являются ссылочными. Точка. Пожалуста, не путайте
Прошу прощения, поросто поведение, при котором изменение параметра не сохраняется, для меня ассоциируется с передачей по значению (слишком много компилируемых языков изучал). Я вобщем-то про то, что переменные являются ссылочными знаю (я не верблюд :)), просто выразился неправильно.
Griffon
Вероятно он хочет передать все параметры одного экземпляра класса другому экземпляру того же класса.
т.е. из примера си вызывается дефолтный, или определённый пользователем оператор класса присвоения. (хотя я си совсем не знаю)

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

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

всё никак не выйдут из головы старые принципы
Андрей Светлов
dartNNN, действительно, передача параметра по значению - это довольно комплексный концепт. “Изменение параметра не сохраняется” - это лишь одно из его свойств. Если говорить точно, по значению передается PyObject*, а не сам PyObject. Разница, заметьте, существенная.
callret
а дело собственно вот в чем:
имеются графические объекты с определенными свойствами (координаты, размер, и т.д.)
например нам нужно связать координаты (xy) некоторых объектов (o1 и o2) так, чтобы изменяя координаты одного - изменялись все связанные
за “связывание” должна отвечать определенная функция

каким красивым образом это решается?
knkd
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)
Как-то так.
Андрей Светлов
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>
>>>
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