不能在函数内引用全局变量

时间:2017-01-20 09:21:10

标签: python python-3.x

大家好日子。 我正在尝试构建一个名为2048的游戏。我创建了一个名为box的变量,并添加了4个列表,每个列表包含4个空值,稍后将被替换。然后我将其声明为全局(也尝试反向:声明为全局,然后将值设置为内部当我在一个函数中调用全局框(对框进行更改)时,它可以正常工作。然后我调用另一个更改框位置的函数,它也没有错误地通过。但是第三个我将框分配给另一个带有list 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,但我调用它来查看是否发生任何错误。没有任何反应。 但是当我对下一个函数错误“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
函数left()出现

错误 也试过不同的操作系统。

thanks.works当我宣布全局内部函数但有人解释为什么它适用于right()但不适用于left()?

2 个答案:

答案 0 :(得分:3)

您必须在函数内部声明全局 ,而不是在外部。模块级变量始终是全局变量:

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

  

在Python中,仅在函数内引用的变量是隐式全局变量。如果在函数体内的任何位置为变量赋值,则除非明确声明为全局,否则将其视为局部值。

答案 1 :(得分:1)

global内部使用功能,而不是在外面。

因此,您可以在文件顶部执行

box = []

并在你的功能中:

global box
# now change box the way you want