2013-12-21 35 views
1

我的代码:全局名称没有被定义的错误

import sys 
import time 
import random 


def main(): 
    print('***TEST**** Grad School Multiplier=',gradschoolmultiplier,'***TEST***') 
    x=gradschoolmultiplier*50000 
    print('Your salary in dollars, $',x) 

def start():  
    gradschool=input('Do you intend to go to Graduate School? ') 
    print('') 
    time.sleep(2) 
    if gradschool=='yes':print('That is a fantastic if expensive decision.') 
    elif gradschool=='Yes':print('That is a fantastic if expensive decision.') 
    elif gradschool=='Y':print('That is a fantastic if expensive decision.') 
    elif gradschool=='y':print('That is a fantastic if expensive decision.') 
    elif gradschool=='YES':print('That is a fantastic if expensive decision.') 
    else:print('No? Well, then it\'s off to work to pay back those student loans.') 
    print('') 
    if gradschool=='yes':g1=3 
    elif gradschool=='Yes':g1=3 
    elif gradschool=='Y':g1=3 
    elif gradschool=='y':g1=3 
    elif gradschool=='YES':g1=3 
    else:g1=1 
    g=random.randrange(1, 3) 
    if g==1:gradschoolmultiplier=1 
    else:gradschoolmultiplier=g1*g/2 
    time.sleep(2) 
    main() 

start() 

当然,我得到:

NameError: global name 'gradschoolmultiplier' is not defined 

我不是足够聪明,了解这个问题的答案为别人着想。有人会用傻瓜的话来解释答案吗?谢谢!

+0

尝试'如果gradschool.lower()的( “Y”, “是”)',把在在每个':'之后换行,然后将'print'和'g1'赋值到同一个块中。 – jonrsharpe

+2

http://www.python.org/dev/peps/pep-0008/ - 你真的需要阅读和理解这个文件。此外,如果您多次重复完全相同的代码,则会造成错误(请参阅@ jonrsharpe的评论)。有一个'main'方法,但使用'start()'作为“主要”方法也是一个坏主意...... – ThiefMaster

回答

1

gradschoolmultiplier不在main()的范围内,它只存在于start()

你可以将它传递给main。

变革的呼吁主要是main(gradschoolmultiplier)

变化def main()def main(gradschoolmultiplier):

Information on python scoping

+0

你是一个天才!谢谢。你会如此友善地解释def main()在做什么与def main(gradschoolmultiplier)? – user3125424

+0

'def main(a)'意味着当调用main时,它需要将1个变量传递给它,并且在main()的代码中该变量将被称为'a'。 'main()'不期望任何东西传递给它。 –

2

事实上,正如@丹说,范围界定问题。您可以使用global变量。

我的一些在你的代码的其他建议:

import sys 
import time 
import random 


def print_salary(): 
    print('***TEST**** Grad School Multiplier=',gradschoolmultiplier,'***TEST***') 
    x = gradschoolmultiplier*50000 
    print('Your salary in dollars, $',x) 

def main():  
    gradschool=input('Do you intend to go to Graduate School? ') 
    print('') 
    time.sleep(2) 

    if gradschool.lower() in {'yes', 'y'}: 
     print('That is a fantastic if expensive decision.') 
     g1 = 3 
    else: 
     print('No? Well, then it\'s off to work to pay back those student loans.') 
     g1 = 1 
    print('') 

    g = random.randrange(1, 3) 
    global gradschoolmultiplier 
    if g == 1: 
     gradschoolmultiplier = 1 
    else: 
     gradschoolmultiplier = g1 * g/2 
    time.sleep(2) 
    print_salary() 

if __name__ == '__main__': 
    main() 

您应该结合一些if报表,使其更简单。

哦,我们有着同样的想法@jonrsharpe

快速改善由@Nils的建议

+0

为什么不使用元组或者设置文字而不是那些列表? '如果在{'yes','y'}中输入' – ThiefMaster

+0

呀!集合更好。 – Ray

+0

我建议将'start()'重命名为'main()'和'main()'可能是'print_salary()'。同样在最后一行,我会使用'if __name__ =='__main__':main()'来推荐 –

相关问题