2

私は、Tkinter モジュールを使用した非常に基本的な GUI プログラミングの初心者です。別のウェブページからソースコードをコピーしたプログラムを実行してみました。

    from Tkinter import *

    def sel():
        selection = "You selected the option " + str(var.get())
        label.config(text = selection)

    root = Tk()
    var = IntVar()
    R1 = Radiobutton(root, text="Option 1", variable=var, value=1,
              command=sel)
    R1.pack( anchor = W )

    R2 = Radiobutton(root, text="Option 2", variable=var, value=2,
              command=sel)
    R2.pack( anchor = W )

    R3 = Radiobutton(root, text="Option 3", variable=var, value=3,
              command=sel)
    R3.pack( anchor = W)

    label = Label(root)
    label.pack()
    root.mainloop()

関数内のグローバルオブジェクトにアクセスするときはいつでも、

    global object_name

それ以外の場合、関数はローカル変数の独自のコピーを作成します。では、関数 sel() の定義で同じことをしてみませんか? sel() の定義に次のステートメントを追加してみました。また、

    global label
    global var

プログラムを実行しましたが、プログラムの動作に違いはありませんでした。何故ですか?

4

1 に答える 1

2

globalグローバル変数を変更する場合にのみ必要です。

次の例を検討してください。

myglobal = 'myglobal'

def test_global():
    print myglobal

test_global()

myglobal #output

バイトコードを見ると、変数myglobalがグローバルとしてロードされていることがわかります。

import dis

dis.dis(test_global)

  2           0 LOAD_GLOBAL              0 (myglobal)
              3 PRINT_ITEM
              4 PRINT_NEWLINE
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE

ただし、定義するmyglobalmyglobal、定数またはローカル変数としてロードされます。

import dis

def test_global():
    myglobal = 'mylocal'

dis.dis(test_global)

  2           0 LOAD_CONST               1 ('mylocal')
              3 STORE_FAST               0 (myglobal)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE

代わりに、myglobal単に定義するのではなく、変更しようとすると、次のようになります。

myglobal += 'another string'

変数がグローバルUnboundLocalErrorであることを Python に伝えていないため、 が得られます。myglobal次のようにしてみてください。

global myglobal
myglobal += 'another string'

これで問題なく動作します。

于 2013-09-30T19:20:32.363 に答える