powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
14 сообщений из 14, страница 1 из 1
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37974954
zagustitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу такую конструкцию:
Код: 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
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37974958
zagustitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В process на самом деле стоит self.mydict, забыл здесь написать.
...
Рейтинг: 0 / 0
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37974960
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zagustitel,

А вы уверены, что хотели именно так написать? Ибо словарь относится к калссу, а не к экземпляру класса.
Может лучше так?
Код: python
1.
2.
3.
4.
5.
class Wood:
    def __init__(self):
        self.mydict = dict()
    def process(self, _value):
        selfmydict[_value] = 0
...
Рейтинг: 0 / 0
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37974991
zagustitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37975006
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37975009
Фотография 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
...
Рейтинг: 0 / 0
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37975010
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zagustitel,

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

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

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

Вам нужен генератор словарей?
Код бессмысленный, там только структура важна.
...
Рейтинг: 0 / 0
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37975017
zagustitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37975024
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zagustitel,

А может стоит почитать мануалы по питону? :)
Вообще лучше сделать как я сказал в своём первом посте
...
Рейтинг: 0 / 0
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37975033
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Создание объектов некоторых классов в Python. Ссылки, копирование и т.п.
    #37975035
zagustitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZzagustitel,

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


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