#Python 3.4.3 (default, Nov 17 2016, 01:08:31)
# start by validating that different variables pointing to an
# empty mutable are indeed different references.
>>> l1 = []
>>> l2 = []
>>> id(l1)
140150323815176
>>> id(l2)
140150324024968
# create a new dict from an iterable of keys
>>> dict1 = dict.fromkeys(['a', 'b', 'c'], [])
>>> dict1
{'c': [], 'b': [], 'a': []}
这可能是一个方便的功能。
在这里,我们给每个键分配一个默认值,这个值碰巧也是一个空列表。
# the dict has its own id.
>>> id(dict1)
140150327601160
# but look at the ids of the values.
>>> id(dict1['a'])
140150323816328
>>> id(dict1['b'])
140150323816328
>>> id(dict1['c'])
140150323816328
你可以使用听写理解:
这个答案是为了解释这个行为给那些被他们试图用
fromkeys()
实例化一个dict
的结果弄糊涂的人,这个dict
中有一个可变的默认值。考虑:
所以对
l1
的任何改变都不会影响l2
,反之亦然。 到目前为止,这对于任何可变的,包括dict
都是正确的。这可能是一个方便的功能。 在这里,我们给每个键分配一个默认值,这个值碰巧也是一个空列表。
事实上,他们都在使用同一个ref! 改变一个就是改变所有人,因为他们实际上是同一个对象!
对许多人来说,这不是他们想要的!
现在让我们尝试将列表的显式副本用作默认值。
现在用
empty_list
的副本创建一个dict。仍然没有快乐! 我听到有人喊,因为我用的是空单子!
fromkeys()
的默认行为是将None
赋给该值。实际上,所有的值都是相同的(而且是唯一的!)
None
。 现在,让我们通过dict
以多种方式之一迭代并更改值。嗯。看起来和以前一样!
但它们确实是不同的,这就是预期的结果。
您可以使用:
相关问题 更多 >
编程相关推荐