当前位置: 首页 > 面试题库 >

使用fromkey和可变对象创建字典。一个惊喜

狄楷
2023-03-14
问题内容

我在Python 2.6和3.2中遇到了让我感到惊讶的行为:

>>> xs = dict.fromkeys(range(2), [])
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: [1]}

但是,dict3.2中的理解显示出更礼貌的举止:

>>> xs = {i:[] for i in range(2)}
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: []}
>>>

为什么会fromkeys这样?


问题答案:

您的Python 2.6示例与以下示例等效,这可能有助于阐明:

>>> a = []
>>> xs = dict.fromkeys(range(2), a)

结果字典中的每个条目都将引用同一对象。如您所见,使该对象发生变异的效果将在每个dict条目中可见,因为它是一个对象。

>>> xs[0] is a and xs[1] is a
True

使用dict理解,或者如果您使用Python 2.6或更早版本并且没有字典理解,则可以通过使用dict()生成器表达式来获得dict理解行为:

xs = dict((i, []) for i in range(2))


 类似资料:
  • 我正在使用JAXB从XSD文件创建Java对象。我正在创建不可变包装器来隐藏由JAXB生成的对象(之前我更新了JAXB对象,以实现不可变接口并将接口返回给客户机。但意识到改变自动生成的类是不好的,因此使用包装器) 目前,我正在将这些不可变的包装返回到客户端应用程序。是否有任何选项,使自动生成的类将是不可变的,并避免创建不可变包装器的额外工作。任何其他方法都是鼓励的。 谢谢

  • 问题 你有一组对象,例如: cats = [ { name: "Bubbles" age: 1 }, { name: "Sparkle" favoriteFood: "tuna" } ] 但是你想让它像词典一样,可以通过关键字访问它,就像使用 cats["Bubbles"]。 解决方案 你需要将你的数组转换为一个对象。通过这样使用 reduce: #

  • 我对RxJS很陌生,所以如果这个问题已经得到回答,我提前道歉。 我有一个Angular 2应用程序,在其中一个组件中有一个普通对象。我将UI绑定到这个对象。我想做的是能够捕获对这个对象的所有更改,无论它们来自代码还是来自用户更改其中一个字段。 我正在查看可观察对象,但似乎只有通过Emit方法推送新对象时,订阅者才能接收通知。例如,在属性绑定到输入字段的情况下,这将如何工作? 有更好的方法吗? 这是

  • 本文向大家介绍JavaScript中创建字典对象(dictionary)实例,包括了JavaScript中创建字典对象(dictionary)实例的使用技巧和注意事项,需要的朋友参考一下 对于JavaScript来说,其自身的Array对象仅仅是个数组,无法提供通过关键字来获取保存的数据,jQuery源码中提供了一种非常好的方式来解决这个问题,先看一下源码: 上述源码是创建一个编译结果的缓存,代码

  • 问题内容: 众所周知,Java 是不可变的。自从成立以来,不可变字符串是Java的重要补充。不变性允许快速访问和大量优化,与C风格的字符串相比,不易出错,并有助于加强安全性模型。 无需使用骇客就可以创建一个可变的对象,即 引导类加载器中的类 JNI(或JNA,因为它需要JNI) 但是有可能仅使用普通Java,以便可以随时修改字符串吗?问题是 如何 ? 问题答案: 使用Charset构造函数创建一个

  • 问题内容: 在Java中,我知道关键字可以提供变量的可见性。问题是,如果变量是对可变对象的引用,是否还为该对象内部的成员提供可见性? 在下面的示例中,如果多个线程正在访问和更改线程,它是否可以正常工作? 例 问题答案: 这是关于volatile的一些细节的旁注说明。在这里写这个是因为评论太多了。我想举一些例子说明挥发性如何影响可见性,以及在jdk 1.5中如何改变。 给出以下示例代码: 此测试代码