Странное взаимодействие между инициализацией класса и глубокой копией в Python

#python-3.x #class #initialization #deep-copy

Вопрос:

Из следующих двух примеров с функцией и без __init__ функции я ожидал бы такого же поведения. Однако поведение отличается (для меня решение с __init__ функцией работает). Чем объясняется такое разное поведение?

Без __init__ :

 import numpy as np from copy import deepcopy  class abc():  q = np.zeros([2])  def run(self):  for i in range(2):  Test = deepcopy(self)  Test.q[i]  = 1e-6  print("self.q:", self.q, "Test.q:", Test.q)  self.q  = 1 Model = abc() Model.run() print(Model.q) Model = abc() print(Model.q)  

Выход:

 self.q: [1.e-06 0.e 00] Test.q: [1.e-06 0.e 00] self.q: [1.e-06 1.e-06] Test.q: [1.e-06 1.e-06] [1.000001 1.000001] [1.000001 1.000001]  

С __init__ :

 import numpy as np from copy import deepcopy   class abc():  def __init__(self):  self.q = np.zeros([2])  def run(self):  for i in range(2):  Test = deepcopy(self)  Test.q[i]  = 1e-6  print("self.q:", self.q, "Test.q:", Test.q)  self.q  = 1 Model = abc() Model.run() print(Model.q) Model = abc() print(Model.q)  

Выход:

 self.q: [0. 0.] Test.q: [1.e-06 0.e 00] self.q: [0. 0.] Test.q: [0.e 00 1.e-06] [1. 1.] [0. 0.]