我正在尝试编写一个简单的Python程序,它将挂钩我正在研究的一个小型微控制器报警项目。微控制器连接到八个开关。它根据串口上的开关状态输出二进制值。
我正在尝试编写python程序解码器,并使用硬编码值来检查我的逻辑。这就是我写的:
switches='11011101'
currentstate = {}
prevstate = {}
def initswitches():
for x in range (0,8):
name = "switch" + str(x)
currentstate[name] = switches[x]
prevstate[name] = switches[x]
def setswitches():
for x in range (0,8):
name = "switch" + str(x)
currentstate[name] = switches[x]
def checkswitches():
for switch in range (0,8):
name = "switch" + str(switch)
if ( currentstate[name] != prevstate[name]):
print name + " value changed to " + str(switch)
initswitches()
for y in range (0,2):
setswitches()
print "Loop" + str(y)
print "Switches:"
print switches
print "Current state:"
print currentstate
print "Previous state:"
print prevstate
checkswitches()
prevstate = currentstate
switches='01001001'
print
print
这是输出:
Loop0
Switches:
11011101
Current state:
{'switch3': '1', 'switch2': '0', 'switch1': '1', 'switch0': '1', 'switch7': '1', 'switch6': '0', 'switch5': '1', 'switch4': '1'}
Previous state:
{'switch3': '1', 'switch2': '0', 'switch1': '1', 'switch0': '1', 'switch7': '1', 'switch6': '0', 'switch5': '1', 'switch4': '1'}
Loop1
Switches:
01001001
Current state:
{'switch3': '0', 'switch2': '0', 'switch1': '1', 'switch0': '0', 'switch7': '1', 'switch6': '0', 'switch5': '0', 'switch4': '1'}
Previous state:
{'switch3': '0', 'switch2': '0', 'switch1': '1', 'switch0': '0', 'switch7': '1', 'switch6': '0', 'switch5': '0', 'switch4': '1'}
如您所见,我能够将每个开关的二进制值正确设置为当前状态,但由于某种原因,以前的状态始终与当前状态匹配。 Loop0显示预期的行为,但Loop1应具有先前的状态匹配Loop0的输出。在调用checkwitches函数之前,我无法找到设置先前状态以匹配currentstate的位置。有人能告诉我哪里出错了吗?
答案 0 :(得分:7)
prevstate = currentstate
将变量prevstate
重定向到等于currentstate
dict。 prevstate
现在与currentstate
完全相同。
这样做会使currentstate
的所有更改也影响prevstate
。
要修复此问题,请prevstate
复制currentstate
:
prevstate = currentstate.copy()
或者,您可以使用prevstate
中的键值对更新currentstate
:
prevstate.update(currentstate)
这个第二个选项可能更可取,因为你会创建(并随后丢弃)更少的对象。