2014-03-25 23 views
1

我面临着一个关于全局变量的问题,尽管它是python声明并不违抗。实质上,我只想检查整数是否包含小数位,或者输入中是否包含任何与整数无关的整数。这里是我的代码:全局名称未定义?同性恋伙伴们:

def Strength1(): 
    try: 
     global strength1 
     strength1 = int(input("%s, please enter your desired strength - between 1 and 20\n>"%name1)) 
     strength1int = int(strength1) 
     def invLoop(): 
      clearScreen() 
      Invalid() 
      Strength1() 
     if int(strength1) <= 0: 
      invLoop() 
     if int(strength1) >= 21: 
      invLoop() 
    except Exception as exception: 
     clearScreen() 
     print("'%s isn't an integer."%strength1) 
     Strength1() 
def Skill1(): 
    try: 
     global skill1 
     skill1 = int(input("%s, please enter your desired skill - between 1 and 20\n>"%name1)) 
     skill1int = int(skill1) 
     def invLoop(): 
      clearScreen() 
      Invalid() 
      Skill1() 
     if int(skill1) <= 0: 
      invLoop() 
     if int(skill1) >= 21: 
      invLoop() 
    except Exception as exception: 
     clearScreen() 
     print("'%s isn't an integer."%skill1) 
     Skill1() 
def Strength2(): 
    try: 
     global strength2 
     strength2 = int(input("%s, please enter your desired strength - between 1 and 20\n>"%name2)) 
     def invLoop(): 
      clearScreen() 
      Invalid() 
      Strength2() 
     if int(strength2) <= 0: 
      invLoop() 
     if int(strength2) >= 21: 
      invLoop() 
    except Exception as exception: 
     clearScreen() 
     print("'%s' isn't an integer."%strength2) 
     Strength2() 
def Skill2(): 
    try: 
     global skill2 
     skill2 = int(input("%s, please enter your desired skill - between 1 and 20\n>"%name2)) 
     def invLoop(): 
      clearScreen() 
      Invalid() 
      Skill2() 
     if int(skill2) <= 0: 
       invLoop() 
     if int(skill2) >= 21: 
       invLoop() 
    except Exception as exception: 
     clearScreen() 
     print("'%s' isn't an integer."%skill2) 
     Skill2() 

,这是我的错误:

Traceback (most recent call last): 
    File "H:\Toby Reichelt\A453\Two Encounters - Developing Dice.py", line 29, in Skill1 
    skill1 = int(input("%s, please enter your desired skill - between 1 and 20\n>"%name1)) 
ValueError: invalid literal for int() with base 10: '0.5' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "H:\Toby Reichelt\A453\Two Encounters - Developing Dice.py", line 197, in <module> 
    mainloop() 
    File "H:\Toby Reichelt\A453\Two Encounters - Developing Dice.py", line 188, in mainloop 
    Skill1() 
    File "H:\Toby Reichelt\A453\Two Encounters - Developing Dice.py", line 41, in Skill1 
    print("'%s isn't an integer."%skill1) 
NameError: global name 'skill1' is not defined 

回答

1

skill1没有定义,因为如果int(input())失败,并抛出一个异常,那么什么都将被分配到skill1

首先将字符串分配给一个变量,然后尝试转换。

try: 
    global skill1 
    skill1 = input("%s, please enter your desired skill - between 1 and 20\n>"%name1) 
    #if the below line crashes, `skill1` will still have the old string value 
    skill1 = int(skill1) 
0

你似乎期待的是,如果用户输入不是一个有效的整数,skill1将被定义为...东西。也许是用户输入的原始文本?无论如何,那不会发生什么。

如果int(input(...))引发异常,则控制转到except块,而不分配skill1。如果即使输入无效也要打印某些内容,则需要将结果分别保存为input,而不是将其转换为整数。

0

global关键词并不意味着“在全局范围内定义变量”,而是“当搜索变量进行修改时,查看全局范围,而不是局部范围”。

您的代码无法运行,您没有呼叫定义的功能。

定义变量skill1,skill2,strength1,strength2在模块中,而不是在功能上,它将解决您遇到的问题。

PS。全局变量很难看。不要这样做。

1

如果您int(input('...'))调用失败,一个Exception提高事情之前分配给skill1。然后,尝试在错误处理中打印skill1的值,但该名称尚未定义。

无论是从异常处理去除skill1(和strength1,和skill2strength2),或者给它们一些默认值(None惯例,或有时-1)的try块外可以肯定,他们是即使用户输入了错误的值也是如此。


这有什么做全局变量;实际上目前尚不清楚在您的代码中是否有任何理由宣布skill1strength1global。只需要清楚,你应该检查docs上的global keyword:它不是定义一个名字;它所做的只是向解析器指出,在本地作用域中对该名称的任何赋值应该应用于模块级作用域中的该名称。

0

的全局变量不会工作

它不会工作的Cuz如果U'r“尝试:除了:”失败并且不会有任何Skill1 为什么不ü定义变量u'r函数外部的?除非你有其他同名的人。我不推荐使用全局变量