Python FOR循环未在嵌套字典中写入正确的值

2024-09-28 05:35:53 发布

您现在位置:Python中文网/ 问答频道 /正文

希望有人能帮我,因为我的研究都没有帮到我。我有一本简单的字典:

mydict = {
    1: {1: 'Foo'},
    2: {1: 'Bar'}
    }

我正在复制每个键/值对,并分配新的键值:

nextKey = len(mydict) + 1
for currKey in range(len(mydict)):
    mydict[nextKey] = mydict[currKey + 1]
    nextKey += 1

这给了我一个

{
    1: {1: 'Foo'},
    2: {1: 'Bar'},
    3: {1: 'Foo'},
    4: {1: 'Bar'},
    }

我现在想向所有现有的嵌套字典添加一个新的键值对。每个嵌套字典的键应为“2”,每个键的值应增加:

newValue = 1
for key in mydict:
    mydict[key][2] = newValue
    newValue += 1

我期待着:

{
    1: {1: 'Foo', 2: 1},
    2: {1: 'Bar', 2: 2},
    3: {1: 'Foo', 2: 3},
    4: {1: 'Bar', 2: 4},
    }

但这给了我一个

{
    1: {1: 'Foo', 2: 3},
    2: {1: 'Bar', 2: 4},
    3: {1: 'Foo', 2: 3},
    4: {1: 'Bar', 2: 4},
    }

我使用了我正在使用的IDE的可视化工具,在我运行循环来复制键/值对之后,新的键似乎只是引用了复制的值,而不是实际包含它,也许这与此有关?你知道吗

IDE Visualisation

有人能帮忙/解释一下吗?你知道吗


Tags: keyinforlen字典foo可视化bar
2条回答

你的假设是对的。最小示例:

>>> a = {1: {"a": "A"}, 2:{"b": "B"}}
>>> a[3] = a[1]
>>> a
{1: {'a': 'A'}, 2: {'b': 'B'}, 3: {'a': 'A'}}
>>> id(a[3])                           # a[1] and a[3] are the same object
140510365203264
>>> id(a[1])
140510365203264
>>> a[1]['a'] = "changed"              # so changing one affects the "oter one"
>>> a
{1: {'a': 'changed'}, 2: set(['B', 'b']), 3: {'a': 'changed'}}

如果要复制对象,有几种方法:

  • 对于列表:new = old[:],使用切片表示法
  • 对于字典:dict.copy()
  • 另见copy module

这是因为在第一个循环中,您没有复制嵌套的字典,而只是向相同的字典添加一个新引用。你知道吗

举一个更清楚的例子:如果你在两个循环之后(用你的原始代码)跳出第二个循环,你的输出将是:

{1: {1: 'Foo', 2: 1}, 
2: {1: 'Bar', 2: 2}, 
3: {1: 'Foo', 2: 1}, 
4: {1: 'Bar', 2: 2}}

所以你可以这样修复你的第一个循环:

for currKey in range(len(mydict)):
    mydict[nextKey] = mydict[currKey + 1].copy()
    nextKey += 1

copy()函数创建字典的真实副本,这样您就可以在第二个循环中访问这4个不同的字典。你知道吗

相关问题 更多 >

    热门问题