Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';我的switch compare Python程序找不到逻辑错误_Python - Fatal编程技术网

Can';我的switch compare Python程序找不到逻辑错误

Can';我的switch compare Python程序找不到逻辑错误,python,Python,我正在尝试编写一个简单的Python程序,该程序将与我正在进行的一个小型微控制器报警项目挂钩。微控制器连接到八个开关。它根据串行端口上的交换机状态输出二进制值 我正在尝试编写python程序解码器,并使用硬编码值来检查我的逻辑。以下是我写的: switches='11011101' currentstate = {} prevstate = {} def initswitches(): for x in range (0,8): name =

我正在尝试编写一个简单的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的输出相匹配。在调用checkswitches函数之前,我找不到要将previous state设置为与currentstate匹配的位置。有人能告诉我哪里出了问题吗

prevstate = currentstate
将变量
prevstate
重定向为等于
currentstate
指令。
prevstate
现在与
currentstate
实际上是同一个对象。 这样做会使对
currentstate
的所有更改也影响
prevstate

要修复,请将
prevstate
复制为
currentstate

prevstate = currentstate.copy()
或者,您可以使用
currentstate
中的键值对更新
prevstate

prevstate.update(currentstate)

第二个选项可能更可取,因为您将创建(并随后丢弃)更少的对象。

@dinky:您可以通过在循环之前放置currentstate[“test”]=True来检查它。您将观察到prevstate变为当前状态(因为分配prevstate=currentstate复制引用而不是内容)只是想提及
copy.deepcopy
,以及使用更复杂结构执行此类操作的人。您还可以执行
prevstate=dict(currentstate)
,看起来你的代码有点过于复杂了。您只需要一个可变的、可索引的序列来存储开关状态,而不是字典映射<代码>当前状态=列表(开关)应该可以正常工作。然后,您可以使用
当前状态[i]
访问交换机
i
的状态。您可以通过使用列表切片(
previous\u state=current\u state[:]
,或通过调用其上的列表构造函数
previous\u state=list(current\u state)
)来复制状态。