在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'}]
所以我现在并没有失去自己的价值观,这就是我想要的,但是我确实显示了两个空字典。我相信我做的事情根本上是错误的。
答案 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()
修改原始字典,则对该字典的所有引用都将显示为空字典。