企业运营效能的提升之道:掌握业务流程和管理流程的精髓
273
2024-01-22
谁能解释一下?当我更改一个元素时,为何YearTonametolist的所有元素都会遭到作用?
yeartonametolist = dict.fromkeys(range(2007,2017),{})yeartonametolist[2007]["a"] = 1
yeartonametolist[2008]["b"] = 2
print yeartonametolist

输出:
{2016: {'a': 1, 'b': 2},
2007: {'a': 1, 'b': 2},
2008: {'a': 1, 'b': 2},
2009: {'a': 1, 'b': 2},
2010: {'a': 1, 'b': 2},
2011: {'a': 1, 'b': 2},
2012: {'a': 1, 'b': 2},
2013: {'a': 1, 'b': 2},
2014: {'a': 1, 'b': 2},
2015: {'a': 1, 'b': 2}
}
看起来它们具有相同的内存地址,因此修改一个修改它们,这是由于它们是唯一的参考。
这是一个更好的解释:
您的第一行使用整数键创建对象,而空对象作为值 全部 他们。
yeartonametolist = dict.fromkeys(range(2007,2017),{})
现在这一点,如果您使用 id()
这样的功能
id(yeartonametolist[2016]) #4294024972Lid(yeartonametolist[2015]) #4294024972L
这是同一ID,所以如果您这样做
yeartonametolist[2007]["a"] = 1yeartonametolist[2008]["b"] = 2
您正在更改同一对象。
如果您更改 {}
至 object()
test = dict.fromkeys(range(2007,2017), object() )print test
输出:
{2016: <object object at 0xfff964d8>,
2007: <object object at 0xfff964d8>,
2008: <object object at 0xfff964d8>,
2009: <object object at 0xfff964d8>,
2010: <object object at 0xfff964d8>,
2011: <object object at 0xfff964d8>,
2012: <object object at 0xfff964d8>,
2013: <object object at 0xfff964d8>,
2014: <object object at 0xfff964d8>,
2015: <object object at 0xfff964d8>
}
每一个关键点的值指向相同的内存地址。
免责声明:
本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、图像、标志、音频、视频、软件和程序等的版权均属于原创作者。如果任何组织或个人认为网站内容可能侵犯其知识产权,或包含不准确之处,请即刻联系我们进行相应处理。
发表评论
暂时没有评论,来抢沙发吧~