2017-01-20 23 views
0

良い日です。 私は2048と呼ばれるゲームを構築しようとしています。私はboxという名前の変数を作りました.4を追加すると、後で置き換えられる4つの空の値を含む各リストがリストに追加されました。それらの中に)私は1つの関数(ボックスに変更を行うために)グローバルなボックスを呼び出すと、それは動作します。その後、ボックスの位置を変更する別の関数を呼び出し、それもエラーなく通過しました。このようなリストcomphrehensionを持つ別の変数に:は関数内のグローバル変数を参照できません

box = [[[]]*4 for i in range(4)] # this is box 
box1 = [box[i][::-1] for i in range(4)] # tried to do this 

第二の機能は、BOX1を必要としませんでしたが、私はすべてのエラーoccurs.Nothingが発生するかどうかを確認するためにそれを呼ばれます。 しかし、次の関数エラーで "NameError:囲みスコープ内の代入の前に参照されるフリー変数ボックス"と同じことが発生したときに発生します。

なぜですか。私は間違っていましたか?ここで コード

import random 
global box 
box = [[[]]*4 for i in range(4)] 


def adding(): 
    digit = random.choice([2,4]) 
    empty = [index for index,i in enumerate(box[0]) if i==[]] 
    add = random.choice(empty) 
    try: 
     for i in range(3): 
      if box[i][add] == [] and box[i+1][add] != []: 
       box[i][add] = digit 
       break 
      elif box[-1][add] == []: 
       box[-1][add] = digit 
       break 
    except: 
     print('Error Occured') 

def right(): 
    box1=[box[i][::-1] for i in range(4)] 
    for i in range(4): 
     take = box[i] 
     box[i]=[[] for x in take if x ==[]] 
     for j in [x for x in take if x != []]: 
      box[i].append(j) 

def left(): 
    box1 = [box[i][::-1] for i in range(4)] 
    right() 
    box1 = [box[i][::-1] for i in range(4)] 
    box= box1 

誤差も異なるOSに試み機能left() で発生されます。

私はグローバルな内部関数を宣言しましたが、なぜ誰かがright()では動作しましたが、left()では動作しなかったことを説明しましたか?

+0

関数の外 'はGlobal'を宣言するにはポイントと'グローバルあなたのインデント –

+0

使用を修正あなたの関数内のボックス ' – MMF

答えて

0

グローバル内には、の機能がありますが、外部ではありません。モジュールレベルの変数は常にグローバルです。

box = ...  

def left(): 
    global box # unnecessary, if not assigned a value 
    box1 = [box[i][::-1] for i in range(4)] 

def foo(): 
    global box # necessary, otherwise box is local 
    box = bar 

変数のみを使用し、新しい値を割り当てないため、グローバル宣言は不要です。したがって、私はデフォルトでグローバルとみなしました。 docsを参照してください:

In Python, variables that are only referenced inside a function are implicitly global. If a variable is assigned a value anywhere within the function’s body, it’s assumed to be a local unless explicitly declared as global.

+0

@hiroprotagonist追加されました、まだ編集中でした... thx – schwobaseggl

0

globalはアウト側、内部の機能を使用されていません。

だから、あなたのファイルの先頭にあなたが

box = [] 

とあなたの関数内での操作を行うことができます

global box 
# now change box the way you want 
関連する問題