別々のインスタンスなのにリストの値が共有されるのはどうして


Pythonで下記のコードを書いたのですが、思っていたのとは違う動作をします。なぜなのでしょうか？

[code]

    class Shape():
        pass
        
    class Square(Shape):
        squs = []
        def __init__(self, w, h):
            self.width = w
            self.height = h
            self.squs.append((self.width, self.height))
    
    square = Square(40, 40)
    square1 = Square(50, 50)
    
    print(square1.squs)
    #結果[(40, 40), (50, 50)]空のリストを代入してから、appendしているので消えそうな気もするのですが？？
    
[/code]

追記

[code]

    class Shape():
        pass
        
    class Square(Shape):
        squs = []
        n = 1
        def __init__(self, w, h):
            self.width = w
            self.height = h
            self.squs.append((self.width, self.height))
            self.n = n + 100
    
    square = Square(40, 40)
    square1 = Square(50, 50)
    print(square1.n)
    print(square.n)
    
[/code]

nが定義されていないというメッセージが出てくるのですが、混乱してきました。  
予想では101、201と出力されると思いました。

詳しい方ご回答いただけると幸いです。




class文が何をするか? という話ですね。

<https://docs.python.org/ja/3/reference/compound_stmts.html#class-definitions>

> 次にクラスのスイートが、新たな実行フレーム (名前づけと束縛 (naming and binding) を参照してください)
> 内で、新たに作られたローカル名前空間と元々のグローバル名前空間を使って実行されます
> (通常、このスイートには主に関数定義が含まれます)。クラスのスイートが実行し終えると、実行フレームは破棄されますが、ローカルな名前空間は保存されます。次に、継承リストを基底クラスに、保存されたローカル名前空間を属性値辞書に、それぞれ使ってクラスオブジェクトが生成されます。最後に、もとのローカル名前空間において、クラス名がこのクラスオブジェクトに束縛されます。

  1. クラスのスイート(本体)が、新たな実行フレーム内で、新たに作られたローカル名前空間と元々のグローバル名前空間を使って実行される
  2. 実行フレームが破棄される
  3. ただしローカルな名前空間が保存される
  4. 継承リストを基底クラスに、保存されたローカル名前空間を属性値辞書に、それぞれ使ってクラスオブジェクトが生成される
  5. もとのローカル名前空間において、クラス名がこのクラスオブジェクトに束縛される

これだけのことが起こります。

* * *

ところで関数定義文は実行した時に[関数本体を実行しません](https://docs.python.org/ja/3/reference/compound_stmts.html#function-
definitions)。  
関数の本体は、"def文が実行された時"には **実行されず** 、"関数が呼び出された時"に初めて実行されます。

対してclass文の本体は、"class文が実行された時"に一度だけ **実行され** 、以降は **実行されることはありません** 。

質問者さんが誤解している、あるいは理解してないことはこの点かと思います。

* * *

(若干余談)

[code]

    class Hoge:
        print('body')
        def __init__(self):
            print('init')
    print('top level')
    Hoge()
    
[/code]

の実行結果を、実行せずに予測できますか?




class文が何をするか? という話ですね。

<https://docs.python.org/ja/3/reference/compound_stmts.html#class-definitions>

> 次にクラスのスイートが、新たな実行フレーム (名前づけと束縛 (naming and binding) を参照してください)
> 内で、新たに作られたローカル名前空間と元々のグローバル名前空間を使って実行されます
> (通常、このスイートには主に関数定義が含まれます)。クラスのスイートが実行し終えると、実行フレームは破棄されますが、ローカルな名前空間は保存されます。次に、継承リストを基底クラスに、保存されたローカル名前空間を属性値辞書に、それぞれ使ってクラスオブジェクトが生成されます。最後に、もとのローカル名前空間において、クラス名がこのクラスオブジェクトに束縛されます。

  1. クラスのスイート(本体)が、新たな実行フレーム内で、新たに作られたローカル名前空間と元々のグローバル名前空間を使って実行される
  2. 実行フレームが破棄される
  3. ただしローカルな名前空間が保存される
  4. 継承リストを基底クラスに、保存されたローカル名前空間を属性値辞書に、それぞれ使ってクラスオブジェクトが生成される
  5. もとのローカル名前空間において、クラス名がこのクラスオブジェクトに束縛される

これだけのことが起こります。

* * *

ところで関数定義文は実行した時に[関数本体を実行しません](https://docs.python.org/ja/3/reference/compound_stmts.html#function-
definitions)。  
関数の本体は、"def文が実行された時"には **実行されず** 、"関数が呼び出された時"に初めて実行されます。

対してclass文の本体は、"class文が実行された時"に一度だけ **実行され** 、以降は **実行されることはありません** 。

質問者さんが誤解している、あるいは理解してないことはこの点かと思います。

* * *

(若干余談)

[code]

    class Hoge:
        print('body')
        def __init__(self):
            print('init')
    print('top level')
    Hoge()
    
[/code]

の実行結果を、実行せずに予測できますか?

