Справка по Python UnboundLocalError: локальная переменная, на которую ссылаются до назначения - PullRequest
2 голосов
/ 14 ноября 2009

Я уже публиковал подобный вопрос раньше, однако, я думаю, что, возможно, неправильно истолковал свой вопрос, поэтому я могу просто опубликовать здесь свой исходный код, и поиск кого-то может помочь мне, я действительно застрял сейчас .. спасибо большое.

from numpy import *
import math as M

#initial condition  All in SI unit
G=6.673*10**-11   #Gravitational constant
ms=1.9889*10**30 #mass of the sun
me=5.9742*10**24 #mass of the earth
dt=10           #time step
#Creat arrays
vs=array([[0,0,0]])     #1st element stand for x component of V of earth
ve=array([[29770,0,0]])
rs=array([[0,0,0]])           
re=array([[0,1.4960*10**11,0]])

#First update velocity in order to start leapfrog approximation
fs=-G*ms*me*((rs-re)/(M.sqrt((rs-re)[0][0]**2+(rs-re)[0][1]**2+(rs-re)[0][2]**2))**3)
fe=-fs
vs=vs+fs*dt/ms 
ve=ve+fe*dt/me

n=input('please enter the number of timestep you want it evolve:')
#update force
def force(n,ms,me,rs,re,G):
    rs,re=update_r(rs,re,n,dt)
    fs=-G*ms*me*((rs-re)/(M.sqrt((rs-re)[0][0]**2+(rs-re)[0][1]**2+(rs-re)[0][2]**2))**3)
    fe=-fs
    return fs,fe

#update velocities
def update_v(n,vs,ve,ms,me,dt,fs,fe):
    fs,fe=force(n,ms,me,rs,re,G)
    i=arange(n)
    vs=vs+fs[:]*i[:,newaxis]*dt/ms
    ve=ve+fe[:]*i[:,newaxis]*dt/me
    return vs,ve

#update position
def update_r(rs,re,n,dt):
    vs,ve=update_v(n,vs,ve,ms,me,dt,fs,fe)
    i=arange(n)
    rs=rs+vs[:]*i[:,newaxis]*dt
    re=re+ve[:]*i[:,newaxis]*dt
    return rs,re
#there is start position,v,r,f all have initial arrays(when n=0).
#then it should calculate f(n=1) then use this to update v(n=0)
#to v(n=1),then use v(n=1) update r(n=0) to r(n=1),then use r(n=1)
#update f(n=1) to f(n=2)....and so on until finish n.but this code seems doesnt do this,,how can I make it? – 

когда я вызываю форс-мажор:

please enter the number of timestep you want it evolve:4Traceback (most recent call last):
  File "<pyshell#391>", line 1, in <module>
    force(n,ms,me,rs,re,G)
  File "/Users/Code.py", line 24, in force
    rs,re=update_r(rs,re,n,dt)
  File "/Users/Code.py", line 39, in update_r
    vs,ve=update_v(n,vs,ve,ms,me,dt,fs,fe)
UnboundLocalError: local variable 'vs' referenced before assignment

Кто-нибудь может дать мне несколько советов? Спасибо ......

Ответы [ 4 ]

9 голосов
/ 14 ноября 2009

где вы называете силу в этом коде?

В любом случае проблема в update_r. Вы ссылаетесь на vs в первой строке update_r, даже если vs не определен в этой функции. Python не смотрит на определенные выше. Попробуйте добавить

global vs

в качестве первой строки update_r или добавление vs в список параметров для update_r

5 голосов
/ 14 ноября 2009

В первой строке update_r у вас есть vs,ve=update_v(n,vs,ve,ms,me,dt,fs,fe). Посмотрите на функцию, которую вы вызываете. Вы звоните update_v с кучей параметров. Одним из этих параметров является vs. Тем не менее, впервые в этой функции появляется vs. С переменной vs еще не связано значение. Попробуйте сначала инициализировать его, и ваша ошибка должна исчезнуть

1 голос
/ 11 марта 2013

Поставьте дополнительный оператор global, содержащий все ваши глобальные переменные после каждого оператора def. В противном случае все глобалы преобразуются в локальные в пределах вашего определения без него.

def update_v(n,vs,ve,ms,me,dt,fs,fe):
    global vs, ve, ...  
0 голосов
/ 14 ноября 2009

В строке 39 вы делаете

vs,ve=update_v(n,vs,ve,ms,me,dt,fs,fe)

пока вы находитесь внутри функции. Поскольку вы определили переменную global с именем vs , можно ожидать, что это сработает. Это сработало бы, если бы у вас было:

vs_new,ve_new = update_v(n,vs,ve,ms,me,dt,fs,fe)

потому что тогда интерпретатор знает, что против в аргументах функции является глобальным. Но так как у вас была против в левой части, вы создали неинициализированную локальную переменную.

Но, чувак, у тебя гораздо большая проблема в твоем коде : update_r вызывает update_v, update_v вызывает force и принудительно вызывает update_r - вы получите переполнение стека :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...