Одинаковая ссылка на свойства объектов

Рейтинг: 0Ответов: 2Опубликовано: 01.02.2023

Возникла проблема, что на две переменные в разных объектах, созданных из одного класса, ссылается одна и та же ссылка. Значение этих переменных задаётся во время создания класса при помощи конструктора.

Особенность в том, что эти объекты находятся внутри массива, свойства третьего объекта созданного другим классом.

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)

Ответы

▲ 1Принят

Проблема тут:

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]
▲ 1

Видимо тут код переписывался после знакомства с Java/C# или чем-то подобным. Поля objects и xy, объявленные таким образом в питоне являются статическими, т.е. разделяются между всеми экземплярами класса. Синтаксически они никак не отличаются от нестатических. Нестатические поля создаются в конструкторе:

class Engine ():
    def __init__ (self):
        self.objects = []

class Obstacle:
    def __init__(self, x, y):
        self.xy = [x, y]