2017-07-04 21 views
1

のグローバル宣言の前に割り当てられている私は、あなたが牛に価値を与えるループ内のグローバル変数cowsbullsを編集しようとしているが、このエラーに"SyntaxError: name 'cows' is assigned to before global declaration"にSyntaxError:名「牛」はPython3.6

import random 

random_no = random.sample(range(0, 10), 4) 
cows = 0 
bulls = 0 
#random_num = ','.join(map(str, random_no)) 
print(random_no) 
user_input = input("Guess the no: ") 
for index, num in enumerate(random_no): 
    global cows, bulls 
    print(index, num) 
    if user_input[index] == num: 
     cows += 1 
    elif user_input[index] in random_no: 
     bulls += 1 

print(f'{cows} cows and {bulls} bulls') 
+2

外で、あなたは必要ありません。 'グローバル'を使う。関数の中で、 'global'宣言を*最初に*置いてください。 –

答えて

2

Pythonにはブロックスコープがありません。関数とクラスのみが新しいスコープを導入します。

あなたがここに何の機能も持っていないので、globalステートメントを使用する必要はありません、cowsbullsすでにグローバルです。

あなたはあまりにも他の問題があります。

  • input()は常に、文字列を返します。

  • インデックス作成は文字列に作用します(個々の文字を取得します)。

  • user_input[index] == numは常にfalseになります。 '1' == 1は、2つの異なるタイプのオブジェクトが等しいかどうかをテストします。ではない。

  • user_input[index] in random_noも常にfalseになるので、random_noリストには整数のみが含まれ、文字列は含まれません。

ユーザーがランダムな番号を入力する場合、整数にinput()を変換し、enumerate()と気にしないでください:機能の

user_input = int(input("Guess the no: ")) 
for num in random_no: 
    if user_input == num: 
     cows += 1 
    elif user_input in random_no: 
     bulls += 1 
+0

あなたの価値を入力し、スクリプトの私の間違いを訂正していただきありがとうございます。プログラムは正常に動作しています。 –

0

を取得していますそれをグローバルとして宣言する前に。グローバルスコープを最初に宣言する必要があります。

グローバル宣言は必要ありません。ただこの行を削除してください。