我很困惑,为什么修改一个使用另一个字典创建的字典会导致运行时错误:字典在迭代过程中改变了大小:
def test(somedict):
new = somedict
for k,v in somedict.iteritems():
new['test'] = new.pop(k)
return new
>>>test(data)
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
test(data[0])
File "<pyshell#10>", line 3, in test
for k,v in somedict.iteritems():
RuntimeError: dictionary changed size during iteration
用例:我试图使用查找表替换字典副本中的所有键,并注意到我无法从没有迭代的新字典中弹出()键。你知道吗
我意识到收到():
new = somedict.copy()
解决问题。但我不明白为什么这在python中是非法的。你知道吗
有人能解释一下new=somedict和new=收到()? 赋值变量并不意味着派生新赋值的数据在修改子变量时也会被修改,至少我是这么想的。你知道吗
相当于:
因为语句
new = somedict
意味着new
与somedict
是同一个字典在循环中,您迭代
somedict
的键/值对,并且弹出somedict
的元素,因此字典的大小发生了变化,从而导致通过使用
new = somedict.copy()
,您可以创建字典的新副本,因此修改new
不会修改somedict
,您就解决了问题。你知道吗简而言之,查找引用语义和值语义来理解Python的行为。你知道吗
这是因为
new = somedict
实际上并不意味着它们是内存中两个独立的对象。它们实际上是相同的物体。你知道吗但是,当您使用
.copy()
时,您现在正在内存中创建一个新对象,允许您对其进行操作。你知道吗提供以下输出:
相关问题 更多 >
编程相关推荐