为什么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谢谢!刚试过这个,现在它工作了,科迪很深