Pythonにおけるクラス変数とインスタンス変数の参照
4463 ワード
参考ブログ:https://blog.csdn.net/m0_37843198/article/details/78896509ブロガーの共有に感謝
クラス変数複数のインスタンスを作成する場合、クラス変数は共有されます!!!
クラス変数がListリストタイプの場合も同様に4共有されます.コードを直接見ます.
出力結果:
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_は変更されませんリストの値
クラス変数複数のインスタンスを作成する場合、クラス変数は共有されます!!!
クラス変数が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_は変更されませんリストの値