Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Python references  (Прочитано 895 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Xepec

  • Автор темы
  • Участник
  • *
  • Сообщений: 156
    • Просмотр профиля
Python references
« : 04 Марта 2009, 18:35:43 »
Такая проблемка, никак не могу разобраться с указателями и значениями в питоне.  :idiot2:
Иногда строка типа a = [b, c] присваивает a значения b и с а иногда указатели на них, и потом очень не приятно узнать что занчение а изменилось потому, что  b и c тоже поменялись.

Как быть уверенным что я передал указатель или значение? Или как присвоить значение?

Заранее спасибо :)
« Последнее редактирование: 06 Марта 2009, 13:40:11 от Xepec »

Оффлайн Jython

  • Участник
  • *
  • Сообщений: 173
  • Ubuntu 9.04 - user
    • Просмотр профиля
Re: Python pointers
« Ответ #1 : 06 Марта 2009, 13:27:27 »
Такая проблемка, никак не могу разобраться с указателями и значениями в питоне.  :idiot2:
Иногда строка типа a = [b, c] присваивает a значения b и с а иногда указатели на них, и потом очень не приятно узнать что занчение а изменилось потому, что  b и c тоже поменялись.

Как быть уверенным что я передал указатель или значение? Или как присвоить значение?

Заранее спасибо :)


Ну в принципе ты правильно сделал

Только значения нужно определять строками

a = ["b", "c"]

а ты определил не правильно

a = [b, c]

Оффлайн Xepec

  • Автор темы
  • Участник
  • *
  • Сообщений: 156
    • Просмотр профиля
Re: Python pointers
« Ответ #2 : 06 Марта 2009, 13:39:25 »
Не, я не это имею в виду....

В общем есть у меня программа, небольшой трехмерный редактор. Делаю в нем функцию undo/redo, и собираюсь хранить упрощенное дерево сцены в отдельном масиве.
Есть такая строчка:
a["data"] = [ m.s,m.e,
m.selected,
m.l,
m.headcolor, m.bodycolor, m.linecolor]
которая записывает состояние объекта в массивчик. Но вместо того, чтобы записать значения m.s, m.e и т.д. записываются сылки на них и потом при изменении сцены весь массив undo изменяется.
Как этого избежать??? Как записать значения m.s, m.e и т.д. а не ссылки на них?

ЗЫ нашел такую штуку: записываем m.s*1 вместо m.s, тогда просчитается выражение и в массив запишется ссылка на объект целое число, которое потом не изменится. Но имхо это как-то не красиво...

Оффлайн Jython

  • Участник
  • *
  • Сообщений: 173
  • Ubuntu 9.04 - user
    • Просмотр профиля
Re: Python references
« Ответ #3 : 06 Марта 2009, 13:45:57 »
Ну если ты имееш ввиду  воспроизвести скрипт
в переменной то так нельзя сделать.

Оффлайн Xepec

  • Автор темы
  • Участник
  • *
  • Сообщений: 156
    • Просмотр профиля
Re: Python references
« Ответ #4 : 06 Марта 2009, 16:05:15 »
неее...
если выполнить
a["data"] = [ m.s,m.e,
m.selected,
m.l,
m.headcolor, m.bodycolor, m.linecolor]
то a["data"] будет содержать ссылки на m.s,m.e, m.selected, m.l, m.headcolor, m.bodycolor, m.linecolor а не их значения, а мне нужны значения.
Как получить значения???

Оффлайн Jython

  • Участник
  • *
  • Сообщений: 173
  • Ubuntu 9.04 - user
    • Просмотр профиля
Re: Python references
« Ответ #5 : 06 Марта 2009, 21:20:04 »
Выложи весь код

Оффлайн Xepec

  • Автор темы
  • Участник
  • *
  • Сообщений: 156
    • Просмотр профиля
Re: Python references
« Ответ #6 : 07 Марта 2009, 02:57:58 »
Эмммм там тыща строк ... :)




Вот кусок который сохраняет...
def save_state(self):
global treestore, max_undo_steps
self.undo[max_undo_steps-1: len(self.undo)] = []
self.undo[:0] = [[]]
def to_str(treemodel, path, iter):                  # Функция колбэк для treestore.foreach приводит элемент в вид масива/словаря...
global action
m = treemodel.get_value(iter, 0)
a = {"type": m.type}
if m.type == "Match" :
a["data"] = [ m.s,m.e,                                                       # вот это место о котором я говорим в а записываются ссылки на переменные
m.selected,
m.l,
m.headcolor, m.bodycolor, m.linecolor]
a["path"] = path
if treestore.iter_parent(iter) != None :
a["parent_path"] = treestore.get_path(treestore.iter_parent(iter))
else :
a["parent_path"] = "()"
action.undo[0].append(a)                     # записываем все в массив "отмен"
treestore.foreach(to_str)
self.undo[0] = pickle.dumps(self.undo[0])             # вот тот peckle который решил проблему в этом месте



ЗЫ в этом моменте я решил проблему pickle'ом (здесь так даже лучше будет), но вобще интерессно как сохранять значения переменных  на не ссылки на них ???

 

Страница сгенерирована за 0.015 секунд. Запросов: 21.