Python 字典只保留最后一次循环迭代的信息
Python dictionary only keeps information from last iteration of loop
我正在尝试创建一个循环来填充来自 Series 的字典 中的 字典:
预期结果是:
{1: {'KEY Mult. by 10': 10, 'KEY Add by 10': 11},
2: {'KEY Mult. by 10': 20, 'KEY Add by 10': 12},
3: {'KEY Mult. by 10': 30, 'KEY Add by 10': 13},
4: {'KEY Mult. by 10': 40, 'KEY Add by 10': 14},
5: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15}}
我正在做的是:
series_1 = pd.Series([1,2,3,4,5])
first_dict = dict() # creating first level of Dict
second_dict = dict({'KEY Mult. by 10': 0, # creating second level of Dict
'KEY Add by 10': 0})
for i in series_1:
first_dict[i] = second_dict
first_dict[i]['KEY Mult. by 10'] = i *10
first_dict[i]['KEY Add by 10'] = i + 10
以上结果为:
{1: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
2: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
3: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
4: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
5: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15}}
然后,当我尝试更改其中一个键的值时,它会更改所有键:
first_dict[3]['KEY Mult. by 10'] = 20
print(first_dict)
{1: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
2: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
3: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
4: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
5: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15}}
谁能帮帮我吗?
将 first_dict[i] = second_dict
更改为:first_dict[i] = dict()
它将按预期工作,这样做您还可以删除“第二级 Dict”的创建
问题是,你多次使用同一个词典,你必须使用一个副本哦 second_dict
import pandas as pd
series_1 = pd.Series([1, 2, 3, 4, 5])
first_dict = dict() # creating first level of Dict
second_dict = dict({'KEY Mult. by 10': 0, # creating second level of Dict
'KEY Add by 10': 0})
for i in series_1:
first_dict[i] = second_dict.copy()
first_dict[i]['KEY Mult. by 10'] = i * 10
first_dict[i]['KEY Add by 10'] = i + 10
一些评论描述了解决方案,但我会详细说明一些。
字典是每个外部索引中的同一块内存。
在你 运行:
之后看到这个
for i in series_1:
first_dict[i] = second_dict
查看两个内部词典的id()
,这些是内存位置:
id(first_dict[1]) # 4511987904
id(first_dict[2])
按照当前编写代码的方式,对任何字典的任何写入都会覆盖所有字典。
在您的机器上,您将有一个(一个)不同的 id 值,但它是相同的 idea-they 将都是相同的内存位置。
要解决此问题,您可以调用构造函数 inside for 循环,它将分配新内存 对于每个内部字典。
for i in series_1:
first_dict[i] = dict({'KEY Mult. by 10': 0,'KEY Add by 10': 0})
first_dict[i]['KEY Mult. by 10'] = i * 10
first_dict[i]['KEY Add by 10'] = i + 10
然后您将看到每个内部字典的不同 id()
return 值,您可以使用 id()
:
确认它们是不同的内存位置
>>> id(first_dict[3])
4511988352
>>> id(first_dict[1])
4511988160
同样,在您的机器上这些值将是不同的 id()
,但想法是相同的,您正在分别为每个内部字典制作 space。
我正在尝试创建一个循环来填充来自 Series 的字典 中的 字典:
预期结果是:
{1: {'KEY Mult. by 10': 10, 'KEY Add by 10': 11},
2: {'KEY Mult. by 10': 20, 'KEY Add by 10': 12},
3: {'KEY Mult. by 10': 30, 'KEY Add by 10': 13},
4: {'KEY Mult. by 10': 40, 'KEY Add by 10': 14},
5: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15}}
我正在做的是:
series_1 = pd.Series([1,2,3,4,5])
first_dict = dict() # creating first level of Dict
second_dict = dict({'KEY Mult. by 10': 0, # creating second level of Dict
'KEY Add by 10': 0})
for i in series_1:
first_dict[i] = second_dict
first_dict[i]['KEY Mult. by 10'] = i *10
first_dict[i]['KEY Add by 10'] = i + 10
以上结果为:
{1: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
2: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
3: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
4: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15},
5: {'KEY Mult. by 10': 50, 'KEY Add by 10': 15}}
然后,当我尝试更改其中一个键的值时,它会更改所有键:
first_dict[3]['KEY Mult. by 10'] = 20
print(first_dict)
{1: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
2: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
3: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
4: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15},
5: {'KEY Mult. by 10': 20, 'KEY Add by 10': 15}}
谁能帮帮我吗?
将 first_dict[i] = second_dict
更改为:first_dict[i] = dict()
它将按预期工作,这样做您还可以删除“第二级 Dict”的创建
问题是,你多次使用同一个词典,你必须使用一个副本哦 second_dict
import pandas as pd
series_1 = pd.Series([1, 2, 3, 4, 5])
first_dict = dict() # creating first level of Dict
second_dict = dict({'KEY Mult. by 10': 0, # creating second level of Dict
'KEY Add by 10': 0})
for i in series_1:
first_dict[i] = second_dict.copy()
first_dict[i]['KEY Mult. by 10'] = i * 10
first_dict[i]['KEY Add by 10'] = i + 10
一些评论描述了解决方案,但我会详细说明一些。
字典是每个外部索引中的同一块内存。 在你 运行:
之后看到这个for i in series_1:
first_dict[i] = second_dict
查看两个内部词典的id()
,这些是内存位置:
id(first_dict[1]) # 4511987904
id(first_dict[2])
按照当前编写代码的方式,对任何字典的任何写入都会覆盖所有字典。
在您的机器上,您将有一个(一个)不同的 id 值,但它是相同的 idea-they 将都是相同的内存位置。
要解决此问题,您可以调用构造函数 inside for 循环,它将分配新内存 对于每个内部字典。
for i in series_1:
first_dict[i] = dict({'KEY Mult. by 10': 0,'KEY Add by 10': 0})
first_dict[i]['KEY Mult. by 10'] = i * 10
first_dict[i]['KEY Add by 10'] = i + 10
然后您将看到每个内部字典的不同 id()
return 值,您可以使用 id()
:
>>> id(first_dict[3])
4511988352
>>> id(first_dict[1])
4511988160
同样,在您的机器上这些值将是不同的 id()
,但想法是相同的,您正在分别为每个内部字典制作 space。