UnboundLocalError:在赋值Python之前引用的局部变量'L'

lvi*_*lvi 6 python python-2.7

当我尝试编译下面的代码时,我得到了这个错误

UnboundLocalError: local variable 'L' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

有人可以解释原因吗?是不是之前分配的全局变量?

我的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()  
Run Code Online (Sandbox Code Playgroud)

Kir*_*sev 22

重现你的bug的最小代码是

x = 1
def foo():
    x += 1
foo()
Run Code Online (Sandbox Code Playgroud)

出现这种情况的原因有很多

  1. 首先 - 因为在python中我们有可变和不可变的类.Int是不可变的,就是当你写的时候x+=1你实际创建了另一个对象(由于CPython的优化,这对于某些int是不正确的).实际发生的是x = x + 1.
  2. 第二 - 因为python编译器检查在作用域内进行的每个赋值,并使在该作用域内分配的每个变量都是局部的.
  3. 因此,当您尝试增加x编译器时,您必须访问该范围的本地变量,但之前从未分配过值.

如果您正在使用python2 - 您只能选择声明变量global.但是这样你就无法从中间函数中获取变量

x = 0
def foo():
  x = 1
  def bar():
    global x
    print x  # prints 0
  bar()
foo()    
Run Code Online (Sandbox Code Playgroud)

在python3中,您有nonlocal关键字来解决这种情况.

另外我建议你避免使用全局变量.还有一个collection.Counter类可能对您有用.

进一步阅读:python docs