Skip to main content
 首页 » 编程设计

python之无法在函数内引用全局变量

2025年05月04日18jyk

大家好。 我正在尝试构建一个名为 2048 的游戏。我制作了一个名为 box 的变量,并添加了 4 个列表,每个列表包含 4 个空值,稍后将被替换。然后我将其声明为全局(也尝试反向:声明为全局,然后在其中创建值他们)。当我在一个函数中调用全局框(对框进行更改)时,它起作用了。然后我调用了另一个函数来更改框的位置并且它也没有错误地通过了。但是第三个我将框分配给另一个具有列表理解的变量是这样的:

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() 发生错误 也在不同的操作系统中尝试过。

谢谢。当我声明全局内部函数时工作正常,但谁能解释为什么它对 right() 有效但对 left() 无效?

请您参考如下方法:

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

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.