Python-多个XOR操作,未定义NameError

Python-多个XOR操作,未定义NameError,python,Python,免责声明:我是Python新手,因此,如果此代码不是Python代码,或者有更简单/更好的编写方法,我深表歉意。任何[建设性]批评都将不胜感激 嘿,好吧,我正在尝试创建一个脚本,它将要求用户输入一个最多8位的二进制输入(一旦这样做有效,将创建实际的请求输入),并对它们执行异或(XOR)操作,并为一个变量分配一个布尔值。问题是,我不明白为什么会出现名字错误。下面的代码涉及三个输入XOR门 以下是错误: 如果布尔(G1)^布尔(e)^布尔(G2): NameError:未定义名称“G1” 据我所知,

免责声明:我是Python新手,因此,如果此代码不是Python代码,或者有更简单/更好的编写方法,我深表歉意。任何[建设性]批评都将不胜感激

嘿,好吧,我正在尝试创建一个脚本,它将要求用户输入一个最多8位的二进制输入(一旦这样做有效,将创建实际的请求输入),并对它们执行异或(XOR)操作,并为一个变量分配一个布尔值。问题是,我不明白为什么会出现名字错误。下面的代码涉及三个输入XOR门

以下是错误:

如果布尔(G1)^布尔(e)^布尔(G2):

NameError:未定义名称“G1”

据我所知,G1没有得到任何分配

a = 0
b = 1
c = 1
d = 0
e = 1
f = 1
g = 0
h = 1

#G1
if bool(b) ^ bool(c) ^ bool(d) :
    G1 = True
elif bool(b) ^ bool(c) == False :
    if bool(d) :
        G1 = True
elif bool(b) ^ bool(c) :
    if bool(d) == False :
        G1 = True
elif bool(b) :
    if bool(c) ^ bool(d) == False:
        G1 = True
else :
    G1 = False

#G2
if bool(f) ^ bool(g) ^ bool(h) :
    G2 = True
elif bool(f) ^ bool(g) == False :
    if bool(h) :
        G2 = True
elif bool(f) ^ bool(g) :
    if bool(h) == False :
        G2 = True
elif bool(f) :
    if bool(g) ^ bool(h) == False:
        G2 = True
else : 
    G2 = False

#G3
if bool(G1) ^ bool(e) ^ bool(G2) :
    G3 = True
elif bool(G1) ^ bool(e) == False :
    if bool(d) :
        G3 = True
elif bool(G1) ^ bool(e) :
    if bool(G2) == False :
        G3 = True
elif bool(G1) :
    if bool(e) ^ bool(G2) == False:
        G3 = True
else :
    G3 = False

你有这样的结构

elif x ^ y: 
    if z:
        G1 = ...
else:
    G1 = ...
在你的代码中。即使在您的情况下,
elif
语句之一可能是正确的,但检查
z
的子条件却不是正确的。这意味着
G1
实际上从未被赋值,因此您会得到未定义的错误

为了解决这个问题,您可以向每个子条件添加一个
else
子句,例如。通过这样做,您将确保肯定会分配
G1

例如:

elif x ^ y: 
    if z:
        G1 = ...
    else:
        G1 = ...
else:
    G1 = ...
这是一个常见(有时很难发现)错误。如果在要稍后使用的条件中指定变量,则必须在条件之前预定义该变量的默认值,或者确保条件中的每个路径都指定该变量

在你的情况下,很容易发现问题。比如说

elif bool(b) ^ bool(c) == False :
    if bool(d) :
        G1 = True
…如果内部
不正确,会发生什么?变量没有赋值,你有一个bug正等着在最不方便的时候消灭你


理想情况下,一个程序应该有配套的测试,驱动它通过每一个可能的状态,以确保它们都工作。至少,应该明确地手动检查代码,以找到可能存在错误的执行路径。

有很多路径没有定义变量。看看第二级条件。。。如果他们不是真的会怎么样?@tdelaney-就是这样!我太专注于更高级别的条件。在输入if语句之前,需要初始化G1、G2和G3,否则它们不会在各自的条件之外继续存在。或者,更好的是,在
if
语句之前将
G1
初始化为
false
。当然,这也会起作用。但是我想指出错误发生的地方,因为这是一个典型的错误,在很多情况下都会发生。有时,如果值不是bool,您可能希望为变量指定不同的值。是的,但您提出的解决方案不安全;它要求条件的构造方式始终能够覆盖所有情况,随着需求的变化,条件很容易被打破。将变量初始化为某个默认值,然后有条件地更改它更安全,并且无论值是否为布尔值,都可以工作