清除字典后,列表中的字典值丢失

时间:2019-07-18 03:02:36

标签: python-3.x list dictionary

在for循环中,我将数据添加到几个词典中,并且需要保留这些词典及其值的运行列表,因此在for循环结束时,我将这些字典添加到列表中。既然我已经完成了dict,就需要在下一次迭代中重用它们,所以我是dict.clear()。但是,这样做也会破坏列表中已经存在的dict的值。我想我现在明白,我只是传递对字典的引用,而不是对值的引用。

我不能让字典增长,因为每个字典将代表数据库中的一行。

如何传递值而不是引用,使它们永久保留在列表中并允许列表增长?

我确定这是一个现有问题的副本(我发现的最接近的是深层复制和浅层复制),但是我没有找到它-可能是因为我不知道如何正确表达问题。更复杂的是,我只写了几个月的Python。

dict1 = {1:'a', 2:'b'}
dict2 = {24:'x',25:'y'}
list1 = dict1, dict2
for l in list1:
    for keys, values in l.items():
        print('key: {}, value: {}'.format(keys, values))

dict1.clear()
dict2.clear()
for l in list1:
    for keys, values in l.items():
        print('keys {}, values {}'.format(keys, values))
print(list1)

key: 1, value: a
key: 2, value: b
key: 24, value: x
key: 25, value: y
({}, {})

Process finished with exit code 0

我希望重复看到这4行。至少那是我想要的:-) 还尝试过:

#list1.append(dict1.copy())
#list1.append(dict2.copy())
list1.append(copy.deepcopy(dict1))
list1.append(copy.deepcopy(dict2))
  

好的,进展。多亏了建议,我将其更改为:

dict1 = {1:'a', 2:'b'}
dict2 = {24:'x',25:'y'}
list1 = [dict1, dict2]

list1.append(copy.deepcopy(dict1))
list1.append(copy.deepcopy(dict2))

dict1.clear()
dict2.clear()
for l in list1:
    for keys, values in l.items():
        print('keys {}, values {}'.format(keys, values))
print('Dicts in list: ',len(list1))
print(list1)

# and get this:
Dicts in list:  4
[{}, {}, {1: 'a', 2: 'b'}, {24: 'x', 25: 'y'}]

所以我现在并没有失去自己的价值观,这就是我想要的,但是我确实显示了两个空字典。我相信我做的事情根本上是错误的。

1 个答案:

答案 0 :(得分:0)

复制dict1和dict2后,您将其清除。您看到的那两个空字典是您在脚本开头添加的dict1和dict2:

const possibleBannerTypes = ['emailBounce', 'anotherBanner'] as const;

interface BannerProps {
  type: typeof possibleBannerTypes[number];
  data?: unknown
}

interface DefaultBannerProps extends BannerProps {
  type: Exclude<typeof possibleBannerTypes[number], EmailBounceBannerProps['type']>; // really just 'anotherBanner' 
}

interface EmailBounceBannerProps extends BannerProps{
  type: 'emailBounce';
  data: {
    reason: string;
  };
}

function test(bannerData: EmailBounceBannerProps | DefaultBannerProps) {
    if (bannerData.type === 'anotherBanner') {
        // do something
    } else if (bannerData.type === 'emailBounce') {
        console.log(bannerData.data.reason)
    }
}

在这里,您将字典添加到列表中,然后进行深度复制,将这两个字典的副本添加到列表中,然后您进行调用:

dict1 = {1:'a', 2:'b'}
dict2 = {24:'x',25:'y'}
list1 = [dict1, dict2]

将字典添加到列表中时,它不会进行复制,只是对原始字典的引用,因此,如果通过dict1.clear() dict2.clear() 修改原始字典,则对该字典的所有引用都将显示为空字典。