1

7行目をコメントアウトすると出力が違う理由がわかりません。コードは次のとおりです。

#!/usr/bin/python
import threading
import time    
def loop(thread_name):      
    if False:
        print "1111"   #The print is only used to prove this code block indeed not excute 
        global dict_test   # The output will be different when commenting this line code
    else:
        dict_test = {}
    i = 0
    while i < 10:
        i+=1
        print  "thread %s %s" % (thread_name,id(dict_test))
        time.sleep(1)

t1=threading.Thread(target=loop,args=('1'))
t2=threading.Thread(target=loop,args=('2'))
t1.start()
t2.start()
t1.join()
t2.join()

どの条件が一致してもグローバル変数がプリコンパイルされるという説明がある場合、次のコードでエラーが報告されるのはなぜですか?

#!/usr/bin/python
import threading
import time    
def loop(thread_name):        
    if False:
        print "1111"   #The print is only used to prove this code block indeed not excute 
        global dict_test   # The output will be different when commenting or uncommenting this line code 
    else:
#        dict_test = {}
        pass
    i = 0
    while i < 10:
        i+=1
        print  "thread %s %s" % (thread_name,id(dict_test))
        time.sleep(1)

t1=threading.Thread(target=loop,args=('1'))
t2=threading.Thread(target=loop,args=('2'))
t1.start()
t2.start()
t1.join()
t2.join()
4

2 に答える 2

4

変数 Python 検索の名前を解決するには、次のようにします。

  • ローカルスコープ

  • 囲んでいる関数のスコープ

  • グローバルスコープ

  • ビルトイン

ソース

ifその他のフロー制御構造については、ここでは言及しません。したがって、内部のスコープifは外部と同じであるため、dict_testこのブロックが実行されているかどうかに関係なく、既存の変数はグローバルになります。

意外かもしれませんが、こう定義されています。

私にとっての出力は

thread 1 50663904
thread 2 50667360
thread 1 50667360
thread 2 50667360
thread 1 50667360
thread 2 50667360
...

したがって、最初は、両方のスレッドが同時に開始されると、2 つの変数は独立しています。2 回目の繰り返しから、両方とも同じグローバル変数を参照します。

于 2013-01-18T09:13:50.277 に答える
0

if ステートメントが実行されるかどうかに関係なく、グローバル ステートメントが適用されます。そのため、グローバル ステートメントをコメント アウトすると、dict_test の割り当てがローカル スコープに適用されます。

于 2013-01-18T09:07:25.577 に答える