Python创建空列表字典:dict构造器与fromkeys()的区别
本文对比Python中创建键值为空列表的两种方法:dict构造器与fromkeys()。通过实验发现,fromkeys()若传入可变对象(如空列表[]),会导致所有键共享同一对象引用,修改任一值将影响全部。推荐使用dict构造器生成独立列表,避免此类陷阱。
在Python中,若需构建键值均为空列表的字典,存在多种实现路径。然而,不同方法在底层机制上是否存在差异?这需要通过实际实验进行验证,并深入剖析其背后的成因。本文将针对两种常见方法展开实验与原理分析。
假设我们需要构建一个类似如下结构的字典,其中键为整数,值为空列表,应如何实现?
{1:[], 2:[], 3:[], 4:[]}
方法1:利用字典构造器
通过调用dict构造器,逐一生成(key, value)键值对来构建字典。
> key = [1, 2, 3, 4]
> a = dict([(k,[]) for k in key])
> a
{1: [], 2: [], 3: [], 4: []}
方法2:使用fromkeys()方法
调用字典内置方法fromkeys(key list, default value),基于给定的键列表和默认值创建新字典。
> key = [1, 2, 3, 4]
> b = {}.fromkeys(key,[])
> b
{1: [], 2: [], 3: [], 4: []}
结果对比分析
这两种方法生成的字典在行为上是否有区别?我们可以通过以下代码进行检验:
> a[1].append(1)
> a
{1: [1], 2: [], 3: [], 4: []} # 仅影响对应的键值列表
>
> b[1].append(1)
> b
{1: [1], 2: [1], 3: [1], 4: [1]} # 所有键值列表都受影响
观察上述实验结果,使用fromkeys()方法生成的字典中,所有键对应的空列表似乎都增加了一个元素。这表明它们可能指向同一个内存对象。
原因深度解析
从实验结果可以看出,通过fromkeys()方法创建的字典,其各键对应的空列表实际上是同一个对象。造成这一现象的原因是:传递给fromkeys()函数的参数“[]”在内存中仅存在一个实例,fromkeys()将该实例的浅拷贝赋值给了字典中的所有键。

若该对象为可变类型(mutable),后续对该列表的任何修改都会影响字典中所有键的值,从而引发逻辑错误。因此,在创建包含可变对象(如列表、字典)作为值的字典时,应严格避免使用fromkeys()方法。
如需了解更多关于Python中创建空列表字典的其他技巧与最佳实践,请参阅下方的相关链接。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













