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

2024-04-25 04:16:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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()  

Tags: inimportforlenrangerandomscreenpygame
3条回答

你把标签和空格混在一起了,别这样。

python -tt yourscript.py运行脚本并修复所有发现的错误。

然后将编辑器配置为只保留缩进的空格;建议使用Python Style Guide的样式,即每次缩进使用4个空格。

接下来,您尝试在这里增加全局L

def compute_dv(p1,p2):
    # ...

    if(L>1000):
        print "r= ", r, "dx= ", dx, "dy= ", dy, "dx/ r*r = ", dx, "dy/ r*r = ", dy
        L+=1

却没有宣布它是全球性的。在该函数中添加global L。对函数内部名称的赋值将此类名称标记为本地名称,除非您明确告诉Python它不是本地名称。

Isn't a global variable assigned before anything else?

是的,但那完全不相干。编译器在函数中看到一个赋值,并将该名称标记为在本地作用域中。您需要在函数的开头使用global关键字来告诉编译器名称应该在全局范围内。

def compute_dv(p1,p2):
    global L
     ...

复制错误的最少代码是

x = 1
def foo():
    x += 1
foo()

这种情况的发生有很多原因

  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()    

在python3中,有nonlocal关键字来处理这种情况。

另外,我建议你避免使用globals。还有一个collection.Counter类可能对您有用。

进一步阅读:python docs

相关问题 更多 >