当试图编译下面的代码时,我得到这个错误
UnboundLocalError: local variable 'L' referenced before assignment
有人能解释为什么吗?全局变量不是在其他变量之前赋值的吗?
我的Python版本是2.7.3
#!/usr/bin/env python
import pygame
from pygame.locals import *
from sys import exit
import random
import math
R = int(8) # promien planety
N = 5 # liczba planet
G = 2 # stala "grawitacyjna"
L = 1
def compute_dv(p1,p2):
dx = p2[0]-p1[0]
dy = p2[1]-p1[1]
r = math.hypot(dx,dy)
dx /= r*r
dy /= r*r
if(L>1000):
print "r= ", r, "dx= ", dx, "dy= ", dy, "dx/ r*r = ", dx, "dy/ r*r = ", dy
L+=1
return G*dx,G*dy
def rand_color():
r = 32*random.randint(0,7)
g = 32*random.randint(0,7)
b = 22*random.randint(0,7)
return (r,g,b)
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
points = []
vs = []
colors = []
for i in range(N):
points.append( [random.randint(0,639), random.randint(0,480)] )
vs.append( [0,0] )
colors.append( rand_color() )
clock = pygame.time.Clock()
screen.fill( (255,255,255))
while True:
clock.tick(30)
for event in pygame.event.get():
if event.type == QUIT:
exit()
for i in range(len(points)):
for j in range(len(points)):
if points[i]!=points[j]:
dvx,dvy = compute_dv( points[i],points[j])
vs[i][0] += dvx
vs[i][1] += dvy
for i in range(len(points)):
points[i][0] += vs[i][0]
points[i][1] += vs[i][1]
screen.fill( (255,255,255))
for i in range(len(points)):
L = []
for w in points[i]:
print int(round(w))
L.append(int(round(w)))
points[i] = L
print points[i], "stop"
#x = raw_input()
pygame.draw.circle(screen, colors[i], points[i], R)
pygame.display.update()
你把标签和空格混在一起了,别这样。
用
python -tt yourscript.py
运行脚本并修复所有发现的错误。然后将编辑器配置为只保留缩进的空格;建议使用Python Style Guide的样式,即每次缩进使用4个空格。
接下来,您尝试在这里增加全局
L
:却没有宣布它是全球性的。在该函数中添加
global L
。对函数内部名称的赋值将此类名称标记为本地名称,除非您明确告诉Python它不是本地名称。是的,但那完全不相干。编译器在函数中看到一个赋值,并将该名称标记为在本地作用域中。您需要在函数的开头使用
global
关键字来告诉编译器名称应该在全局范围内。复制错误的最少代码是
这种情况的发生有很多原因
x+=1
时,您实际上创建了另一个对象(由于CPython所做的优化,某些int不是这样)。实际发生的是x=x+1。x
时,编译器必须访问该作用域的本地变量,但以前从未分配过值。如果您使用的是python2,那么您只能选择声明变量
global
。但这样就无法从中间函数获取变量,比如在python3中,有
nonlocal
关键字来处理这种情况。另外,我建议你避免使用globals。还有一个
collection.Counter
类可能对您有用。进一步阅读:python docs
相关问题 更多 >
编程相关推荐