関数内部でglobal宣言よりもnonlocal宣言が優先されるのはなぜですか？

[code]

    def scope_test():
        def do_local():
            spam="local spam"
        def do_nonlocal():
            nonlocal spam
            spam="non-local spam"
        def do_global():
            global spam
            spam="global spam"
        spam="test spam"
        do_local()
        print("After local assignment:", spam)
        do_nonlocal()
        print("After nonlocal assignment:", spam)
        do_global()
        print("After global assignment:", spam)
    
    scope_test()
    print("In global assignment:", spam)
    
[/code]

出力はこうなる：

[code]

    After local assignment: test spam
    After nonlocal assignment: non-local spam
    After global assignment: non-local spam
    In global scope: global spam
    
[/code]

らしいのですが、"After global assignment: non-local spam"となる理由がわかりません。なぜ、do_global():
global spamの次にあるのに、"global spam"ではなく"non-local
spam"となるか、初心者でもわかるように、超簡単にご説明いただけないでしょうか。




そのプログラムでは合計３つの`spam`変数が登場しますが、区別できるようにコメントをつけるとこうなります。

[code]

    def scope_test():
        def do_local():
            spam="local spam" # spam1
        def do_nonlocal():
            nonlocal spam # spam2
            spam="non-local spam"
        def do_global():
            global spam # spam3
            spam="global spam"
        spam="test spam" # spam2
        do_local()
        print("After local assignment:", spam) # spam2
        do_nonlocal()
        print("After nonlocal assignment:", spam) # spam2
        do_global()
        print("After global assignment:", spam) # spam2
    
    scope_test()
    print("In global assignment:", spam) # spam3
    
[/code]

`do_local`は当然ローカル変数`spam`を宣言して代入しているだけなので、`scope_test`で宣言された変数`spam`(spam2)には影響しません。

`do_non_local`は`nonlocal
spam`により、グローバルスコープを除く外側のスコープに存在する一番階層が近い変数`spam`(この場合spam2)を使いますよ、と宣言することになります。よって`do_non_local`を実行後はspam2の値は`"non-
local spam"`になります。

(グローバルスコープとは一番外側のスコープです)

最後に`do_global`は`global
spam`によりグローバルスコープの変数`spam`を使いますよ、と宣言します。コードにはグローバル変数`spam`の宣言がありませんが、`do_global`内で`spam="global
spam"`を実行した時点で、グローバル変数`spam`(spam3)が作られます。

結局、`do_global`はspam2に影響しないので、`"non-local spam"`が出力されるということになります。

