Создание отдельных объектов в функции
Взгляните на следующий фрагмент кода:
class MyObj(object): name = "" def __init__(self, name): self.name = name v = [ {} ] * 2 def f(index): v[index]['surface'] = MyObj('test') v[index]['num'] = 3 if __name__ == '__main__': f(0) f(1) v[0]['num'] = 4 print v[1]['num']
То, что я ожидал получить в качестве вывода последней строки, равно 3
; однако он печатает 4
. Поэтому это должно означать, что новый объект создается всегда на том же ссылочном адресе.
Как я могу избежать такого поведения? (т. е. как я могу сделать вышеприведенные отпечатки кода 4?)
- Реализовано собственное __getattr__; возникла неожиданная ошибка
- Психопатия: создание нескольких объектов линии одновременно
- Google app engine Как считать SUM из datestore?
- pycharm: байтовый литерал содержит символы> 255
- В чем разница между __init__ и __call__ в Python?
Вам нужно создать два слова:
v = [ {},{} ]
Или используйте цикл:
v = [ {} for _ in range(2)]
Вы создаете две ссылки на один и тот же объект.
In [2]: a = [{}] * 2 In [3]: id(a[0]) Out[3]: 140209195751176 In [4]: id(a[1]) Out[4]: 140209195751176 In [5]: a[0] is a[1] Out[5]: True In [6]: a = [{} for _ in range(2)] In [7]: id(a[1]) Out[7]: 140209198435720 In [8]: id(a[0]) Out[8]: 140209213918728 In [9]: a[0] is a[1] Out[9]: False
- Django CBV – Как избежать повторения get_context_data для каждого представления, чтобы получить собственный заголовок?
- Почему бы мне не выполнить параллельное выполнение?
- Как запросить модели с определенным родителем (не любым предком) в GAE
- Выбор объектов данных из json-массивов в Python
- Python: различное поведение в режиме отладки run vs в PyCharm
- Почему неправильно писать «for» после «import os;»
- Как автоматически перезагрузить файл python при его изменении
- random.choice всегда одинаковый
- Не удалось запустить сервер devlopment – BindError: невозможно найти согласованный порт localhost
- Python: более сжатый синтаксис для присваивания переменной при доступе к объекту NoneType
- Хорошее копирование из Python Interpreter