Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Python 3.x 更新嵌套字典python3时出现错误行为_Python 3.x_Dictionary_Defaultdict - Fatal编程技术网

Python 3.x 更新嵌套字典python3时出现错误行为

Python 3.x 更新嵌套字典python3时出现错误行为,python-3.x,dictionary,defaultdict,Python 3.x,Dictionary,Defaultdict,在python3.7中处理集合包的defaultdict类时,我看到新键是从上一个键的副本生成的,而不是启动字典。在下面的示例代码中,是否有一种方法可以使用给定的字典初始化新元素,即init\u dict 再现错误的示例代码: from collections import defaultdict init_dict = {'buy_qty': 0, 'sell_qty': 0} pnl = defaultdict(lambda: init_dict) pnl['a

在python3.7中处理集合包的defaultdict类时,我看到新键是从上一个键的副本生成的,而不是启动字典。在下面的示例代码中,是否有一种方法可以使用给定的字典初始化新元素,即
init\u dict

再现错误的示例代码:

from collections import defaultdict
init_dict = {'buy_qty': 0, 
             'sell_qty': 0}

pnl = defaultdict(lambda: init_dict)
pnl['a']['buy_qty'] += 1
pnl['a']['sell_qty'] += 1
现在当我这么做的时候

pnl['b'] 
给我

{'buy_qty': 1, 'sell_qty': 1}

我正在寻找用
init\u dict
初始化的
pnl['b']
。我怎样才能做到这一点呢?

您的复制是通过引用,而不是通过价值。因此,无论你对一本词典做什么,另一本词典都会受到影响

您可以通过以下功能进行检查:

print(id(pnl['a']))
print(id(pnl['b']))

print(id(pnl['a']) == id(pnl['b']))
这将提供相同的内存地址:

1817103232768
1817103232768
True
验证它们是否是相同的对象。如注释中所述,您可以通过使用指定字典的浅层副本来解决此问题:

pnl = defaultdict(lambda: init_dict.copy())
或铸造
dict()

或从以下位置使用
**


另外,考虑使用A来进行计数,而不是自己初始化零计数字典:

from collections import defaultdict, Counter

pnl = defaultdict(Counter)

pnl['a']['buy_qty'] += 1
pnl['a']['sell_qty'] += 1

print(pnl)
# defaultdict(<class 'collections.Counter'>, {'a': Counter({'buy_qty': 1, 'sell_qty': 1})})

print(pnl['b']['buy_qty'])
# 0

print(pnl['b']['buy_qty'])
# 0

pnl['b']['buy_qty'] += 1
pnl['b']['sell_qty'] += 1

print(pnl)
# defaultdict(<class 'collections.Counter'>, {'a': Counter({'buy_qty': 1, 'sell_qty': 1}), 'b': Counter({'buy_qty': 1, 'sell_qty': 1})})
从集合导入defaultdict,计数器
pnl=默认DICT(计数器)
pnl['a']['buy_qty']+=1
pnl['a']['sell_qty']+=1
打印(pnl)
#defaultdict(,{'a':计数器({'buy_数量:1,'sell_数量:1}))
打印(pnl['b']['buy_qty'])
# 0
打印(pnl['b']['buy_qty'])
# 0
pnl['b']['buy_qty']+=1
pnl['b']['销售数量]+=1
打印(pnl)
#defaultdict(,{'a':计数器({'buy_qty':1,'sell_qty':1}),'b':计数器({'buy_qty':1,'sell_qty':1})

Counter
dict
的一个子类,因此它们的工作原理与普通词典相同

通过引用而不是通过值进行复制。因此,无论你对一本词典做什么,另一本词典都会受到影响

您可以通过以下功能进行检查:

print(id(pnl['a']))
print(id(pnl['b']))

print(id(pnl['a']) == id(pnl['b']))
这将提供相同的内存地址:

1817103232768
1817103232768
True
验证它们是否是相同的对象。如注释中所述,您可以通过使用指定字典的浅层副本来解决此问题:

pnl = defaultdict(lambda: init_dict.copy())
或铸造
dict()

或从以下位置使用
**


另外,考虑使用A来进行计数,而不是自己初始化零计数字典:

from collections import defaultdict, Counter

pnl = defaultdict(Counter)

pnl['a']['buy_qty'] += 1
pnl['a']['sell_qty'] += 1

print(pnl)
# defaultdict(<class 'collections.Counter'>, {'a': Counter({'buy_qty': 1, 'sell_qty': 1})})

print(pnl['b']['buy_qty'])
# 0

print(pnl['b']['buy_qty'])
# 0

pnl['b']['buy_qty'] += 1
pnl['b']['sell_qty'] += 1

print(pnl)
# defaultdict(<class 'collections.Counter'>, {'a': Counter({'buy_qty': 1, 'sell_qty': 1}), 'b': Counter({'buy_qty': 1, 'sell_qty': 1})})
从集合导入defaultdict,计数器
pnl=默认DICT(计数器)
pnl['a']['buy_qty']+=1
pnl['a']['sell_qty']+=1
打印(pnl)
#defaultdict(,{'a':计数器({'buy_数量:1,'sell_数量:1}))
打印(pnl['b']['buy_qty'])
# 0
打印(pnl['b']['buy_qty'])
# 0
pnl['b']['buy_qty']+=1
pnl['b']['销售数量]+=1
打印(pnl)
#defaultdict(,{'a':计数器({'buy_qty':1,'sell_qty':1}),'b':计数器({'buy_qty':1,'sell_qty':1})

Counter
dict
的一个子类,因此它们的工作原理与普通词典相同

lambda
函数中执行
init\u dict.copy()
。谢谢@Asocia,它可以工作。它是否可以作为指向init_dict的指针。在
lambda
函数中执行
init_dict.copy()
。谢谢@Asocia,它可以工作。它是否作为指向init_dict的指针工作。?