Python3.4字典值替换问题

蒂米哈

我有一些代码,其中包含字典列表并创建另一个字典列表。列表中的每个字典都有两个键/值对“ ID”和“ opcode”,其中“ opcode”是32位数字。

我的代码需要创建第二个字典列表,其中的操作码是分开的,即,具有opcode = 5的字典将成为具有opcode = 1和opcode = 4的两个字典。

(操作码是32位数字,我的要求是只有1位高,即操作码= 1,2,4,8,16等)

我已将问题简化为以下内容;我的代码需要将此:

part=[{"ID":1,"opcode":4},{"ID":2,"opcode":5},{"ID":3,"opcode":6}]

到这个:

part_=[{"ID":1,"opcode":4},{"ID":2,"opcode":1},{"ID":2,"opcode":4},{"ID":3,"opcode":2},{"ID":3,"opcode":4}]

目前我的代码如下

def bit_set(theNumber,bit):
    return theNumber&(1<<bit)!=0

part=[{"ID":1,"opcode":4},{"ID":2,"opcode":5},{"ID":3,"opcode":6}]

part_=[]
for i in part:
    for j in range(32):
        if bit_set(i["opcode"],j):
            part_.append(i)
            part_[-1]["opcode"]=(1<<j)

for i in part_:
    print(i)

代码的输出为:

{'opcode': 4, 'ID': 1}
{'opcode': 1, 'ID': 2}
{'opcode': 2, 'ID': 3}

有趣的是,如果我稍微修改代码以使值修改行不存在,则会创建额外的字典,但是显然操作码是不正确的。

def bit_set(theNumber,bit):
    return theNumber&(1<<bit)!=0

part=[{"ID":1,"opcode":4},{"ID":2,"opcode":5},{"ID":3,"opcode":6}]

part_=[]
for i in part:
    for j in range(32):
        if bit_set(i["opcode"],j):
            part_.append(i)
            #part_[-1]["opcode"]=(1<<j)

for i in part_:
    print(i)

输出是

{'ID': 1, 'opcode': 4}
{'ID': 2, 'opcode': 5}
{'ID': 2, 'opcode': 5}
{'ID': 3, 'opcode': 6}
{'ID': 3, 'opcode': 6}

我可以通过以不同的方式解决问题来解决问题,但是出于对了解正在发生的事情的兴趣,我超出了深度。

西装

这是因为,当您追加i到新列表时,您没有创建字典的副本,而是添加了对原始字典的引用。这意味着,当您在下一行更改字典时,也会在中更改值part这导致循环不匹配操作码的任何其他部分。如果part在代码末尾打印出的值,则可以看到此信息

python文档将其解释为:

Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此一个副本可以更改一个副本而无需更改另一个副本。参考

您可以通过在添加字典时创建字典副本来解决此问题。这将使您可以在不影响原始词典的情况下更改值。Python允许您使用copy模块(文档复制对象

只需导入copy,然后part_.append(copy.copy(i))代替part_.append(i)

import copy

def bit_set(theNumber,bit):
    return theNumber&(1<<bit)!=0

part = [{"ID": 1, "opcode": 4}, {"ID": 2, "opcode": 5}, {"ID": 3, "opcode": 6}]

part_=[]
for i in part:
    for j in range(32):
        if bit_set(i["opcode"],j):
            part_.append(copy.copy(i))
            part_[-1]["opcode"]=(1<<j)

for i in part_:
    print(i)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python3字典,值作为列表

来自分类Dev

Python3字典理解

来自分类Dev

python-将键的值替换为与同一字典中的不同键对应的值

来自分类Dev

Python3字典-Python找不到绝对存在的密钥

来自分类Dev

Python3:将一个字典中每个键的多个值除以另一字典中每个键的多个值

来自分类Dev

Python 3.5字典比较

来自分类Dev

比较2字典并提取python中的其他值

来自分类Dev

Python 3字典理解执行错误

来自分类Dev

字典清单Python3

来自分类Dev

Python3 硒问题

来自分类Dev

Python-唯一字典的列表,其中每个字典值都是一个列表

来自分类Dev

Python 2.6字典构建器符号

来自分类Dev

python 2.7字典将参数传递给.get

来自分类Dev

Python 2.7.9字典查找和删除

来自分类Dev

Python3 - 从创建字典数组时的性能问题

来自分类Dev

双字典如何排序?(Python3)

来自分类Dev

是否有Python方式将一个字典的浮点值添加到另一字典的值列表中?

来自分类Dev

Python3中的cmp问题

来自分类Dev

Debian10 python3问题

来自分类Dev

Python3中的cmp问题

来自分类Dev

Django 1.6.5 + python3 wsgi问题

来自分类Dev

OSX上Python3的证书问题

来自分类Dev

使用Python3安装Django的问题

来自分类Dev

Python3导入出现问题

来自分类Dev

Python3代码问题

来自分类Dev

Python3 中的 ASCII 问题

来自分类Dev

遍历字典动态更新值 Python3

来自分类Dev

基于值的Python3词典合并

来自分类Dev

在终端中用python3替换python2?