изменяется статическая переменная класса в питоне

Пример, где все нормально работает.

class fly:
  counter = 0 # CLASS VARIABLE

  def __init__(self):
    print('var counter instance before',self.counter)
    print('var counter class before',fly.counter)
    self.new = fly.counter  # INSTANCE VARIABLE
    self.new = 5
    print('var counter instance after',self.counter)
    print('var counter class after',fly.counter)
    print('var new instance after',self.new)

a = fly()
# var counter instance before  0 (OK)
# var counter class before     0 (OK)
# var counter instance after   0 (OK)
# var counter class after      0 (OK)
# var new instance after       5 (OK)

b = fly()
# var counter instance before  0 (OK)
# var counter class before     0 (OK)
# var counter instance after   0 (OK)
# var counter class after      0 (OK)
# var new instance after       5 (OK)

А вот с массивом уже такая логика не работает, статический массив класса меняется:

class fly:
  counter = [3,5] # CLASS ARRAY

  def __init__(self):
    print('array counter instance before',self.counter)
    print('array counter class before',fly.counter)
    self.new = fly.counter  # INSTANCE ARRAY
    self.new[1] = 7
    print('array counter instance after',self.counter)
    print('array counter class after',fly.counter)
    print('array new instance after',self.new)

a = fly()
# array counter instance before  [3,5] (OK)
# array counter class before     [3,5] (OK)
# array counter instance after   [3,7] (NO, must be [3,5])
# array counter class after      [3,7] (NO, must be [3,5])
# array new instance after       [3,7] (OK)

b = fly()
# array counter instance before  [3,7] (NO, must be [3,5])
# array counter class before     [3,7] (NO, must be [3,5])
# array counter instance after   [3,7] (NO, must be [3,5])
# array counter class after      [3,7] (NO, must be [3,5])
# array new instance after       [3,7] (OK)

Как правильно передавать статический массив и при этом чтобы менять только в INIT?


Ответы (1 шт):

Автор решения: GrAnd

Этим вы присваиваете ссылку на список в переменную self.new:

self.new = fly.counter

Этим вы меняете элемент по индексу 1 оригинального списка (по ссылке):

self.new[1] = 7

Как всегда, решение со списками - это их копировать:

self.new = fly.counter.copy()
→ Ссылка