大家好日子。 我正在尝试构建一个名为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()?
答案 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