изменяется статическая переменная класса в питоне
Пример, где все нормально работает.
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()