Вам не хватает того, что Python рассматривает все как ссылку.(Есть некоторые «неизменяемые» объекты, строки, числа и кортежи, которые обрабатываются больше как значения.) Когда вы делаете
lattice[:,:] = site(3)
, вы говорите «Python: создайте новый объект site
, искажите каждому элементу lattice
указать на этот объект. "Чтобы убедиться, что это действительно так, выведите массив, чтобы убедиться, что адреса памяти объектов одинаковы:
array([[<__main__.Site object at 0x1029d5610>,
<__main__.Site object at 0x1029d5610>,
<__main__.Site object at 0x1029d5610>],
[<__main__.Site object at 0x1029d5610>,
<__main__.Site object at 0x1029d5610>,
<__main__.Site object at 0x1029d5610>],
[<__main__.Site object at 0x1029d5610>,
<__main__.Site object at 0x1029d5610>,
<__main__.Site object at 0x1029d5610>]], dtype=object)
Циклический способ - это один из правильных способов сделать это.С массивными массивами это может быть вашим лучшим вариантом;со списками Python вы также можете использовать понимание списка:
lattice = [ [Site(i + j) for i in range(3)] for j in range(3) ]
Вы можете использовать понимание списка с конструкцией numpy.array
:
lattice = np.array( [ [Site(i + j) for i in range(3)] for j in range(3) ],
dtype=object)
Теперь, когда вы печатаете lattice
, это
array([[<__main__.Site object at 0x1029d53d0>,
<__main__.Site object at 0x1029d50d0>,
<__main__.Site object at 0x1029d5390>],
[<__main__.Site object at 0x1029d5750>,
<__main__.Site object at 0x1029d57d0>,
<__main__.Site object at 0x1029d5990>],
[<__main__.Site object at 0x1029d59d0>,
<__main__.Site object at 0x1029d5a10>,
<__main__.Site object at 0x1029d5a50>]], dtype=object)
, так что вы можете видеть, что каждый объект там уникален.
Вы также должны заметить, что методы "setter" и "getter" (например, set_a
)непитоновский.Лучше устанавливать и получать атрибуты напрямую, а затем использовать декоратор @property
, если вам ДЕЙСТВИТЕЛЬНО нужно запретить доступ на запись к атрибуту.
Также обратите внимание, что для классов Python стандартно писать с использованием CamelCase, а нев нижнем регистре.