Одинаковая ссылка на свойства объектов
Возникла проблема, что на две переменные в разных объектах, созданных из одного класса, ссылается одна и та же ссылка. Значение этих переменных задаётся во время создания класса при помощи конструктора.
Особенность в том, что эти объекты находятся внутри массива, свойства третьего объекта созданного другим классом.
class Engine ():
objects = []
def __init__ (self):
pass
class Obstacle:
xy = [0,0]
def __init__(self, x, y):
self.xy[0] = x
self.xy[1] = y
engine = Engine ()
engine.objects.append (Obstacle(4, 4))
engine.objects.append (Obstacle(6, 6))
При выводе массива xy, значение равно [6,6].
Код ниже выводит True.
print (engine.objects[0].xy is engine.objects[1].xy)
Ответы (2 шт):
Проблема тут:
class Obstacle:
xy = [0,0]
Тут xy - переменная класса, т.е. она привязана не к конкретному экземпляру класса, а одна для всех экземпляров.
Делайте так:
class Obstacle:
def __init__(self, x, y):
self.xy = [0, 0]
self.xy[0] = x
self.xy[1] = y
Можно еще более упростить:
class Obstacle:
def __init__(self, x, y):
self.xy = [x, y]
Видимо тут код переписывался после знакомства с Java/C# или чем-то подобным. Поля objects и xy, объявленные таким образом в питоне являются статическими, т.е. разделяются между всеми экземплярами класса. Синтаксически они никак не отличаются от нестатических. Нестатические поля создаются в конструкторе:
class Engine ():
def __init__ (self):
self.objects = []
class Obstacle:
def __init__(self, x, y):
self.xy = [x, y]