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

 八卦男1002_426 发布于 2023-01-30 13:30

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

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

1 个回答
  • 重现你的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

    2023-01-30 13:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有