2017-01-04 7 views
1

にインポートを経由して機能を実行している:私は次のスクリプトを持っているのpython

最初はtest1.py

x = 1 

def test(): 

    globx = x 
    print(globx) 
    globx += 1 
    return globx 

x = test() 

であり、第二はtest2.py

import test1 

z=3 
while z != 0: 
    if __name__=='__main__': 
     test1.test() 
     z -= 1 
    else: 
     pass 

である私は学ぶためにこれらを使用していますし、他のスクリプトの関数を呼び出すと、私が望むのは出力です:

1 
2 
3 

が、私は得る:

1 
2 
2 
2 

私は

global x 
print(x) 
x += 1 

test1.py

globx = x 
    print(globx) 
    globx += 1 
    return globx 

x = test() 

を交換するとき、私は望ましい結果を得るのですが、どうやらあなたは使用しないでくださいグローバル変数のように、私は壊れたいと思う習慣です。

私には2つの質問があります。

  1. は、なぜ私が間違って出力を取得しないと私はtest1.py代わりの3のglobx = xバージョンを使用する場合
  2. はなぜ4つの出力があるのですか?

答えて

0

import test1とすると、スクリプト全体が実行されます。関数test()が初めて呼び出されます。 1を出力し、xを2に変更します。ループ内でtest1.test()を3回呼び出します。 globxはローカル変数です。これは3回印刷され(2)、3回に3回変更されましたが、変更は保存されません。

2

なぜ出力が間違っていますか?

あなたがtest1をインポートしているが1を印刷しxをインクリメント、初めてtestを実行し、xに割り当てる、初めて実行されます。

次にあなたがtest2内部test別の3回を実行しますが、xを更新せず、そうtestは、xglobxを設定し、印刷xglobxを更新し、まだ(2に貼付)手付かずのxを残します。

なぜ4つの出力がありますか?

zから3に設定し、0に数えます。 z = 3, 2, 1, 0 OVER!。したがって、z = 1..3を実行すると、ロードされたときにtest1の内部で実行される時間は+になります。

修正方法? test1.py

:すべてのアクションのための

使用グローバルxtestを実行しないでください:

x = 1 

def test(): 
    global x 
    print(x) 
    x += 1 

test2.pyで:

反復3回rangeと。モジュールは、他のいずれかによって実行された場合、あなたのelse: passは無限ループをトリガーになります。

import test1 

if __name__ == '__main__': 
    for _ in range(3): 
     test1.test() 
+0

おかげで、これはうまく動作しますが、私は 'あなたが発電機を使用することができ – user1630350

+0

はGlobal'使用しないように期待していたが、それはより複雑になります。グローバルなことなしに現在の価値をどのように保つことを他にどのように考えましたか? – Uriel

+0

'return globx'を使い、' test = 'test1.test()'を呼び出すたびに 'x'を手動で設定した場合にのみ動作する' x = test() ' – user1630350

関連する問題