Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Создание объектов некоторых классов в Python. Ссылки, копирование и т.п. / 14 сообщений из 14, страница 1 из 1
27.09.2012, 18:11:21
    #37974954
zagustitel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
Пишу такую конструкцию:
Код: python
1.
2.
3.
4.
5.
6.
class Wood:
    mydict = {}
    def __init__(self):
        pass
    def process(self, _value):
        mydict[_value] = 0



Использую так:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
w1 = Wood()
w1.process( 1 )
w1.process( 2 )
w1.process( 3 )

w2 = Wood()
for w in w1.mydict:
    w2.process( random.random() )



Цикл валится, ибо " RuntimeError: dictionary changed size during iteration". Как манипуляции с w2 трогают w1?
...
Рейтинг: 0 / 0
27.09.2012, 18:13:43
    #37974958
zagustitel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
В process на самом деле стоит self.mydict, забыл здесь написать.
...
Рейтинг: 0 / 0
27.09.2012, 18:17:11
    #37974960
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
zagustitel,

А вы уверены, что хотели именно так написать? Ибо словарь относится к калссу, а не к экземпляру класса.
Может лучше так?
Код: python
1.
2.
3.
4.
5.
class Wood:
    def __init__(self):
        self.mydict = dict()
    def process(self, _value):
        selfmydict[_value] = 0
...
Рейтинг: 0 / 0
27.09.2012, 18:45:59
    #37974991
zagustitel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
NekZzagustitel,

А вы уверены, что хотели именно так написать? Ибо словарь относится к калссу, а не к экземпляру класса.
Может лучше так?
Код: python
1.
2.
3.
4.
5.
class Wood:
    def __init__(self):
        self.mydict = dict()
    def process(self, _value):
        selfmydict[_value] = 0


Я питон плохо знаю, но сделал вывод о том как правильно из такого эксперимента:

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
import sys, os

class Wood:
	p = 1
	
	def __init__(self):
		pass
		
	def f1(self):
		self.p += 1
	
	def f2(self):
		print self.p
		
		

w1 = Wood()
w2 = Wood()

w1.f1()
w1.f1()
w1.f1()
w1.f1()

w2.f2()
w1.f2()



Печатает:
Код: python
1.
2.
1
5


Что говорит о том, что вызовы w1.f1() не влияют на w2.
...
Рейтинг: 0 / 0
27.09.2012, 19:03:30
    #37975006
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
zagustitel,

А что вы на это скажете?
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class Wood:
    p = {'a': 1, 'b': 2}

    def __init__(self):
        pass

    def f1(self):
        self.p.update({'c': 3})

    def f2(self):
        print(self.p)



w1 = Wood()
w2 = Wood()

w1.f1()

w2.f2()
w1.f2()


Выводит:
{'a': 1, 'c': 3, 'b': 2}
{'a': 1, 'c': 3, 'b': 2}

Process finished with exit code 0

Константные типы и ссылки - разные вещи
...
Рейтинг: 0 / 0
27.09.2012, 19:07:29
    #37975009
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
Если дописать ещё
Код: python
1.
2.
3.
4.
5.
6.
#класс
    def f3(self):
        print(id(self.p))

w2.f3()
w1.f3()


То id объектов совпадает
Выводит
25683616
25683616

Process finished with exit code 0
...
Рейтинг: 0 / 0
27.09.2012, 19:07:54
    #37975010
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
zagustitel,

Непонятен смысл этой конструкции:
Код: python
1.
2.
for w in w1.mydict:               # Здесь вываливается ошибка
    w2.process( random.random() ) # из-за этого

Вам нужен генератор словарей?
...
Рейтинг: 0 / 0
27.09.2012, 19:10:26
    #37975011
zagustitel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
Usmanzagustitel,

Непонятен смысл этой конструкции:
Код: python
1.
2.
for w in w1.mydict:               # Здесь вываливается ошибка
    w2.process( random.random() ) # из-за этого

Вам нужен генератор словарей?
Код бессмысленный, там только структура важна.
...
Рейтинг: 0 / 0
27.09.2012, 19:19:48
    #37975017
zagustitel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
NekZЕсли дописать ещё
Код: python
1.
2.
3.
4.
5.
6.
#класс
    def f3(self):
        print(id(self.p))

w2.f3()
w1.f3()


То id объектов совпадает
Выводит
25683616
25683616

Process finished with exit code 0

Понимать! Какой злой питон. А почему моя фигня с w1, w2 работает тогда?
...
Рейтинг: 0 / 0
27.09.2012, 19:29:53
    #37975024
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
zagustitel,

А может стоит почитать мануалы по питону? :)
Вообще лучше сделать как я сказал в своём первом посте
...
Рейтинг: 0 / 0
27.09.2012, 19:37:58
    #37975033
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
zagustitel,

Код: python
1.
2.
3.
4.
5.
w2 = Wood()

mydict_len = len(w1.mydict)
for i in range(mydict_len):
  w2.process( random.random() )
...
Рейтинг: 0 / 0
27.09.2012, 19:42:19
    #37975035
zagustitel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
NekZzagustitel,

А может стоит почитать мануалы по питону? :)
Вообще лучше сделать как я сказал в своём первом посте
Я так и сделаю. И мораль про идентификаторы понятна. Но история с w1, w2 ведь как-то работает, собака.
...
Рейтинг: 0 / 0
27.09.2012, 19:43:16
    #37975036
zagustitel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
Usmanzagustitel,

Код: python
1.
2.
3.
4.
5.
w2 = Wood()

mydict_len = len(w1.mydict)
for i in range(mydict_len):
  w2.process( random.random() )


Это да. Я даже copy.deepcopy() успел заюзать для этого dictionary от безысходности. Но теперь меня научили.
...
Рейтинг: 0 / 0
28.09.2012, 05:46:33
    #37975372
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
zagustitelНо история с w1, w2 ведь как-то работает, собака.
Дело в том, что там тип int, объекты которого не изменяются. И операции выполняете над ним путём присваивания . В случае со словарём оперируем с ним путём вызова методов . Суть в том, что в вашем первом примере идёт вызов методы __setitem__ у словаря (как operator[] в C++), который изменяет словарь, принадлежащий объекту метакласса -- классу. Если бы вы присваивали словарю другой словарь - то не было бы такого, я атвичаю . Читайте про аттрибуты и про последовательность получения аттрибута. На хабре есть статеечка - в ней описано как работает эта магия (пункт Соль ).
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Создание объектов некоторых классов в Python. Ссылки, копирование и т.п. / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]