不断出现全局名称未定义错误

2 投票
6 回答
12107 浏览
提问于 2025-04-16 19:47
def defineType(riskCode):
    if riskCode == 1:
        riskType = High
    else:
        if riskCode == 2:
            riskType = Moderate
        else:
            if riskCode == 3:
                riskType = Low
            else:
                if RiskCode == 4:
                    riskType = No

这是我正在为一门课程做的一个程序的一部分……

# Global Variables
custName = input('Please enter your name: ')
custAge = int(input('Please enter your age: '))
custViolation = int(input('Please enter the number of violations: '))

riskCode = 0
estimatePrice = 0
riskType = none

这些是我的全局变量……

Traceback (most recent call last):
  File "C:\Users\Alli\Downloads\HwyRobbery.py", line 13, in <module>
    riskType = none
NameError: name 'none' is not defined

这是我不断遇到的错误,根据我尝试解决问题所做的不同修改,错误信息也会有所不同。

任何帮助都将非常感谢!!!

谢谢!
Alli

6 个回答

3

其实你不需要用函数来做风险映射,你可以直接使用下面的代码:

riskmapping = {1:High, 2:Moderate, 3:Low, 4:No}

不过如果“High”等这些不是实例或变量,而只是字符串的话,你可以这样做:

riskmapping = {1:'High', 2:'Moderate', 3:'Low', 4:'No'}

用法:

highRisk = riskmapping[1]

或者

if riskmapping[currentRiskCode]:
    #do smth
8

我看到的第一个问题是,none 不是 Python 中的内置值,而 None 是的。

另外,第一个函数里那一堆嵌套的 if 语句其实没必要,可以简化一下!

def defineType(riskCode):
    if riskCode == 1:
        riskType = High
    elif riskCode == 2:
        riskType = Moderate
    elif riskCode == 3:
        riskType = Low
    elif RiskCode == 4:
        riskType = No

这样写虽然不是错误,但可读性更高,对吧?(而且打字也更简单 :)

还有,我猜你在代码的其他地方定义了 HighModerateLowNo 吧?如果你把它们当作枚举常量使用(也就是一组不变的独特整数),那么用 HIGHMODERATELOWNO 会更符合习惯。

事实上,如果你这样做了,整个函数可以像这样简化掉:

HIGH = 1
MODERATE = 2
LOW = 3
NO = 4

这样你就根本不需要再映射它们了;你可以直接把 riskCode 赋值给 riskType,虽然现在这样可能有点多余!

riskType = riskCode

如果你想从风险代码中获取字符串,可以试试第二个字典,具体可以参考 Artsiom Rudzenka 的回答

最后……我建议把这些代码放在自己的命名空间里:

class Risk(object):
    HIGH = 1
    MODERATE = 2
    LOW = 3
    NO = 4

这样你就可以像这样引用它们:

if riskCode == Risk.HIGH: do_something()

现在你可以自由地用 NO 这样的简短词汇来表示其他东西了。

16

None而不是none。Python是区分大小写的。

撰写回答