当我尝试编译下面的代码时,我得到了这个错误
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()
Kirill Zaits.. 22
重现你的bug的最小代码是
x = 1 def foo(): x += 1 foo()
出现这种情况的原因有很多
首先 - 因为在python中我们有可变和不可变的类.Int是不可变的,就是当你写的时候x+=1
你实际创建了另一个对象(由于CPython的优化,这对于某些int是不正确的).实际发生的是x = x + 1.
第二 - 因为python编译器检查在作用域内进行的每个赋值,并使在该作用域内分配的每个变量都是局部的.
因此,当您尝试增加x
编译器时,您必须访问该范围的本地变量,但之前从未分配过值.
如果您正在使用python2 - 您只能选择声明变量global
.但是这样你就无法从中间函数中获取变量
x = 0 def foo(): x = 1 def bar(): global x print x # prints 0 bar() foo()
在python3中,您有nonlocal
关键字来解决这种情况.
另外我建议你避免使用全局变量.还有一个collection.Counter
类可能对您有用.
进一步阅读:python docs
重现你的bug的最小代码是
x = 1 def foo(): x += 1 foo()
出现这种情况的原因有很多
首先 - 因为在python中我们有可变和不可变的类.Int是不可变的,就是当你写的时候x+=1
你实际创建了另一个对象(由于CPython的优化,这对于某些int是不正确的).实际发生的是x = x + 1.
第二 - 因为python编译器检查在作用域内进行的每个赋值,并使在该作用域内分配的每个变量都是局部的.
因此,当您尝试增加x
编译器时,您必须访问该范围的本地变量,但之前从未分配过值.
如果您正在使用python2 - 您只能选择声明变量global
.但是这样你就无法从中间函数中获取变量
x = 0 def foo(): x = 1 def bar(): global x print x # prints 0 bar() foo()
在python3中,您有nonlocal
关键字来解决这种情况.
另外我建议你避免使用全局变量.还有一个collection.Counter
类可能对您有用.
进一步阅读:python docs