为什么python字典会对在另一个相同的字典上执行的操作做出反应?
很抱歉把书名弄混了,我不太清楚怎么用词。 我的代码如下:为什么python字典会对在另一个相同的字典上执行的操作做出反应?,python,dictionary,Python,Dictionary,很抱歉把书名弄混了,我不太清楚怎么用词。 我的代码如下: eps = [] newdict = dictionary.items for ep in range(minepisode, maxepisode + 1): eps.append(str(ep)) for key in dictionary.keys(): if key not in eps: newdict.pop(key) 但是,当我尝试运行它时,它返回错误 RuntimeError: dicti
eps = []
newdict = dictionary.items
for ep in range(minepisode, maxepisode + 1):
eps.append(str(ep))
for key in dictionary.keys():
if key not in eps:
newdict.pop(key)
但是,当我尝试运行它时,它返回错误
RuntimeError: dictionary changed size during iteration
尽管对“newdict”而不是“dictionary”进行了更改,但我正在迭代的是“dictionary”
在shell中四处游荡之后,我发现如果我制作了两本相同的字典,如下所示:
x = {'1':'something'}
newx = x
newx.pop('1')
x和newx中的“1”键都已删除。为什么会这样?如何修复原始代码中的错误?首先,python中的dict是可变的数据结构 所以,它是这样工作的
x = {'1':'something'}
>>> id(x)
140222539383424
>>> id(newx)
140222539383424
因此,这里创建了dict
对象x
newx = x
因此,这里您将相同的dict
对象引用到另一个名为newx
的变量
理想情况下,您不需要创建新对象,只需将同一对象引用到其他变量即可
你可以看到这样的相似性
x = {'1':'something'}
>>> id(x)
140222539383424
>>> id(newx)
140222539383424
两个对象的Id相同
您还可以使用对象相似性
来验证这一点,使用is
>>> newx is x
True
因此,出于显而易见的原因,无论您是尝试更改x
还是newx
,您都在更改相同的引用对象。如果您想在循环中更改dict,您应该使用copy.deepcopy()
;它将为两者分配单独的内存
例如:
import copy
a = {'key':'value'}
b = copy.deepcody(a)
希望它能对您有所帮助。:) 你有一只狗,你是一个非凡的人,你在偶数天叫你的狗flash
,在奇数天叫你的狗turtle
。今天,3月28日,flash
伤到了他们的右前腿,如果明天你发现乌龟也伤到了右前腿,你会感到惊讶吗
Python就是这样,你有永久性的对象和你贴在上面的名字。。。其中一些对象是不可变的(例如字符串),当您想修改其中一个对象时,您正在创建一个新对象,而旧对象仍然存在,旧对象标记为flash
,新对象标记为turtle
——其他对象是可变的(例如字典),以便可以将更改直接应用于对象本身,他们所有人的名字都提到了这一点
对我来说,不可变对象的行为是最令人惊讶的,但我知道我是少数。。。因此,我需要保护
免责声明:在写这篇文章的过程中,没有动物受到伤害。假设你有一个列表colors=['blue','green]
。当您执行类似于palete=colors
的操作时,您将palete
作为colors
的别名:它们都引用位于相同内存地址的相同列表
colours=['blue','green']
palette=colours
print id(colours)==id(palette) #True
print id(colours[0])==id(palette[0]) #True
有一种方法可以改变它。考虑你定义<代码>调色板=列表(颜色)< /代码>。现在,您创建了一个位于内存中另一个地址的新列表。但现在两个列表都包含相同地址的元素:调色板[0]和颜色[0]位于同一地址
colours=['blue','green']
palette=list(colours)
print id(colours)==id(palette) #False
print id(colours[0])==id(palette[0]) #True
最后,你有了深度拷贝
from copy inport deepcopy
colours=['blue','green']
palette=deepcopy(colours)
print id(colours)==id(palette) #False
print id(colours[0])==id(palette[0]) #False
您不是在创建新的dict,只是复制对旧dict的引用。请使用copy或deepcopy克隆该dict。@Selcuk谢谢!刚试过这个,现在它工作了,科迪很深