2016-04-11 14 views
0

今日私は新しいコードのために必要なものをいくつかテストしていましたが、問題に遭遇しました。私は、次のコードを削減:Python 2.7 - グローバル変数が更新されない(関数を使用)

def SomeFunction(): 
    global Turn 
    if Turn == 1: 
     #some code 
     Turn = 0 

    if Turn == 0: 
     #some code 
     Turn = 1 

    print Turn 

Turn = 1 
for i in range(10): 
    SomeFunction() 

私が午前問題は、この関数は1、10回を印刷し続けるということです。私が何をしたいのは、それが1、次に0、そして1などを印刷するということです。

私はいくつかの既存のスタックオーバーフローポストを見ましたが、それらはすべて、関数内で変数TurnがグローバルであることをPythonに伝える必要があることを示唆していますが、これを既に行っているので、

グローバル変数を使用する必要があるので、ローカル変数のみを使用するのは解決策ではありません。

よろしく、 害

+6

ペンとペーパーで実行します。はい、結果は常に「1」になります。おそらく、あなたは*** elifを***使いたいと思うかもしれません。 – deceze

答えて

1

を使用してみてください現在はTrueですので、Turnは1にリセットされます。

これを処理するには分かりやすい方法です他の人が触れたようにelifを使用してください。あるいは、printを両方のブランチに複製し、最初のブランチにreturnの早い方を置くこともできます。 elifアプローチは、コードの重複を避けるために優れています。可能であれば、早めにreturnを回避するのも良いスタイルです。しかし、私はとにかくあなたのコードを紹介します:

def SomeFunction(): 
    global Turn 
    if Turn == 1: 
     #some code 
     Turn = 0 
     print Turn 
     return 

    if Turn == 0: 
     #some code 
     Turn = 1 
     print Turn 

Turn = 1 
for i in range(10): 
    SomeFunction() 

出力

0 
1 
0 
1 
0 
1 
0 
1 
0 
1 

ところで、通常のPythonの慣習は、単純な変数と関数名の下ケースを使用することです。クラス名には、CapitalizedとCamelCaseの名前が使用されます。もちろん、にはこの規則に従うのにがありませんが、ほとんどの構文ハイライトソフトウェアで見たときにコードが奇妙に見えるので、Pythonコミュニティの残りの部分を不必要に混乱させます。

詳細はPEP 0008 -- Style Guide for Python Codeを参照してください。


実は、あなたはifステートメントを使用せずに、0と1の間の値を交互にすることができます。トリックは、排他的論理和演算子を使用する^です:

def SomeFunction(): 
    global Turn 
    Turn ^= 1 
    print Turn 

Turn = 1 
for i in range(10): 
    SomeFunction() 

これは、前と同じ出力になります。

変数はこれまでは値をとる場合はゼロ、それがより読みやすいコードにつながることができて、あなたが、代わりにブールで行うことを検討し、それをFalseTrue間の代替を持っている必要があります1。あなたはでそれを交互にすることができます

Turn = not Turn 

とあなたはそれが何人かの人々がいることをやって好きではないが、ちょうど0または1のように振る舞い、そしてそれ少ない検討する算術式でのブール値を、使用することができます読める。


私はまた、あなたがglobalを利用するのは避けるべきことを言及すべきであると思います。それは便利ですが、変更可能なグローバルを使用すると、コードのモジュール性が損なわれます。小さなスクリプトではそれほど大したことではありませんが、複雑なプログラムを書くときには、モジュラー設計に本当に感謝しています。

+0

ああ、私は通常、elifを使っていますが、この場合は必要ではないと思っていましたが、それはかなり馬鹿に戻っていました。 btw、私は大文字の変数を使用しています。なぜなら、そのように読むのは簡単だと思うからですが、それを指摘してくれてありがとう。私はPEPに従うことを試みるが、私はどのように名前変数について考えなかったのだろうか? –

+0

@HarmPrins:FWIW、実際には0から1の間で変数をフリップするより効率的な方法がある。 –

+0

効率的なソリューションのようですが、私の場合はTurn変数に応じてコードのさまざまな部分を実行します。私は常にグローバル変数を避けようとしますが、この場合は避けられません。私はTkinterと9x9グリッドのボタンを使用しています。各ボタンは同じ関数を呼び出しますが、引数は異なりますが、プログラムの開始時にボタンが初期化されるため、Turn変数を引数として送ることはできません。 –

1

問題は、一度、再び電源を入れ、上書きされていることです。 が1に等しい最初if条件はTrueになりますので、Turnが0に設定されます。しかし、実行が第二ifに渡しているTurn場合

elif Turn == 0: 

代わりの

if Turn == 0: 
関連する問題