Pythonにおけるクラス変数とインスタンス変数の参照

4463 ワード

参考ブログ:https://blog.csdn.net/m0_37843198/article/details/78896509ブロガーの共有に感謝
クラス変数複数のインスタンスを作成する場合、クラス変数は共有されます!!!
クラス変数がListリストタイプの場合も同様に4共有されます.コードを直接見ます.
class Dog:
  
    n = 4 #    
    n_list = []
            #                         
    def __init__(self,name): #    
        self.name = name #     
    '''
          ,         ,            ,             
    '''
    def bulk(self): #    
        print('%s: wang wang!!!'%self.name)

d1 = Dog("BeiBei") #                  ----                    
d2 = Dog("xiaohei")

d1.n = 8  #                     
d1.n_list.append("From Dog1")
print("dog2======%s----dog2 n_list =====%s"%(d2.n,d2.n_list))
d2.n = 23
d2.n_list.append("From Dog2")#       n_list      ,                Dog     
print("dog1 n ===%s----dog1 n_list ====%s"%(d1.n,d1.n_list))
print("dog2======%s----dog2 n_list =====%s"%(d2.n,d2.n_list))
print("Dog ======%s-----Dog n_list =====%s"%(Dog.n,Dog.n_list))
d1.bulk()

print("--------------------------------------------------------")
d1.n_list = ["from Dog1 hahahah"] #               ,    d1 n_list     d2   Dog n_list
print("d1 n_list==========%s d2 n_list =====%s"%(d1.n_list,d2.n_list))

出力結果:
dog2======4----dog2 n_list =====['From Dog1']dog1 n ===8----dog1 n_list ====['From Dog1', 'From Dog2']dog2======23----dog2 n_list =====['From Dog1', 'From Dog2']Dog ======4-----Dog n_list =====['From Dog1', 'From Dog2']BeiBei: wang wang!!!--------------------------------------------------------
d1 n_list==========['from Dog1 hahahah'] d2 n_list =====['From Dog1', 'From Dog2']
インスタンス:
 d1.n=8はクラス変数にインスタンス属性を作成するので、変更後のDogクラスとインスタンスd 2のn値は変更されません
リストクラス変数については、多くの学生が輪をかぶっています.
リストの操作はd 1です.n_list.append(「From Dog 1」)はリストを直接操作し、クラス変数にインスタンス属性を作成しません.
d1.n_list.append(「From Dog 1」)は、まず、インスタンスd 1のインスタンス変数でn_を検索するList,見つからない,続いてクラスDogで検索して,えっ!!!私は拭いて、これはありませんか、だからクラスDogの中のn_をリストは変更されました.両方のインスタンスd 1およびd 2は、参照クラスのn_であるlistだから印刷時d 1 d 2 Dogのn_リストは変更されました
インスタンスの最後:
d1.n_list=(「from dog 1 hahahah」)この呼び出しはクラス変数のインスタンス参照を作成するので、インスタンスd 1のn_のみが変更されます.リストの値
Dog d 2のn_は変更されませんリストの値