インスタンスの考え方


下のコードを実行すると  
結果は、

[code]

    出力結果: データ1 データ2
    
[/code]

となります。  
私は、

[code]

    出力結果: データ1
    
[/code]

となると予想しておりました。  
sample1とsample2は別メモリだと思ったからです。  
理解できないでいます。  
ご指導よろしくお願いいたします。

[code]

       class Sample:
        
          c_list = []
        
          def add_c_list(self,data):
            self.c_list.append(data)
        
        print("出力結果:", end=" ")
        sample1 = Sample()
        sample1.add_c_list("データ1")
        
        sample2 = Sample()
        sample2.add_c_list("データ2")
        
        for item_data in sample1.c_list:
          print(item_data, end=" ")
    
[/code]




ご質問のコメントにある重複候補のリンクとは[別の回答](https://ja.stackoverflow.com/a/56191)が端的で分かりやすく感じました。  
類似質問の回答で頻出するPythonチュートリアルの[クラスとインスタンス変数](https://docs.python.org/ja/3.7/tutorial/classes.html#class-
and-instance-variables)も良くまとまっていますので、ご一読をお勧めします。

class直下で宣言された変数は **クラス変数** と呼ばれ、全てのインスタンスで値が共有されます。  
class直下で宣言 **されてない** self変数は **インスタンス変数** と呼ばれ、個別のインスタンスごとに別々の値を持ちます。

下記のサンプルコードで、クラス変数とインスタンス変数のリストの値を可視化してみました。

**サンプルコード:**

[code]

    class Sample:
        c_list = []  #クラス変数
    
        def __init__(self):
            self.i_list = []  #インスタンス変数
    
        def add_list(self,data):
            self.c_list.append(data)
            self.i_list.append(data)
    
    sample1 = Sample()
    sample1.add_list("データ1")
    
    sample2 = Sample()
    sample2.add_list("データ2")
    
    print("sample1.c_list:", ",".join(sample1.c_list))
    print("sample2.c_list:", ",".join(sample2.c_list))
    print("sample1.i_list:", ",".join(sample1.i_list))
    print("sample2.i_list:", ",".join(sample2.i_list))
    
[/code]

**出力結果:**

[code]

    sample1.c_list: データ1,データ2
    sample2.c_list: データ1,データ2
    sample1.i_list: データ1
    sample2.i_list: データ2
    
[/code]




ご質問のコメントにある重複候補のリンクとは[別の回答](https://ja.stackoverflow.com/a/56191)が端的で分かりやすく感じました。  
類似質問の回答で頻出するPythonチュートリアルの[クラスとインスタンス変数](https://docs.python.org/ja/3.7/tutorial/classes.html#class-
and-instance-variables)も良くまとまっていますので、ご一読をお勧めします。

class直下で宣言された変数は **クラス変数** と呼ばれ、全てのインスタンスで値が共有されます。  
class直下で宣言 **されてない** self変数は **インスタンス変数** と呼ばれ、個別のインスタンスごとに別々の値を持ちます。

下記のサンプルコードで、クラス変数とインスタンス変数のリストの値を可視化してみました。

**サンプルコード:**

[code]

    class Sample:
        c_list = []  #クラス変数
    
        def __init__(self):
            self.i_list = []  #インスタンス変数
    
        def add_list(self,data):
            self.c_list.append(data)
            self.i_list.append(data)
    
    sample1 = Sample()
    sample1.add_list("データ1")
    
    sample2 = Sample()
    sample2.add_list("データ2")
    
    print("sample1.c_list:", ",".join(sample1.c_list))
    print("sample2.c_list:", ",".join(sample2.c_list))
    print("sample1.i_list:", ",".join(sample1.i_list))
    print("sample2.i_list:", ",".join(sample2.i_list))
    
[/code]

**出力結果:**

[code]

    sample1.c_list: データ1,データ2
    sample2.c_list: データ1,データ2
    sample1.i_list: データ1
    sample2.i_list: データ2
    
[/code]

