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

dict.fromkeys的有害行为

隆飞驰
2023-03-14
问题内容

我想使用初始化一个字典集(在Python 2.6中)dict.fromkeys,但是结果结构表现得很奇怪。进一步来说:

>>>> x = {}.fromkeys(range(10), set([]))
>>>> x
{0: set([]), 1: set([]), 2: set([]), 3: set([]), 4: set([]), 5: set([]), 6: set([]), 7: set([]), 8: set([]), 9: set([])}
>>>> x[5].add(3)
>>>> x
{0: set([3]), 1: set([3]), 2: set([3]), 3: set([3]), 4: set([3]), 5: set([3]), 6: set([3]), 7: set([3]), 8: set([3]), 9: set([3])}

我显然不想将3加到所有集合中,而只添加到对应于的集合中x[5]。当然,可以通过x不使用进行初始化来避免此问题fromkeys,但是我想了解一下我在这里缺少的内容。


问题答案:

的第二个参数dict.fromkeys只是一个值。您已经创建了一个字典,该字典的设置与每个键的值 相同 。大概您了解它的工作方式:

>>> a = set()
>>> b = a
>>> b.add(1)
>>> b
set([1])
>>> a
set([1])

您在那看到相同的行为;你的情况,x[0]x[1]x[2](等)的访问完全相同的所有不同的方式set对象。

使用其字符串表示形式包括其内存地址的对象,可以更容易地看到它们,在这里您可以看到它们是相同的:

>>> dict.fromkeys(range(2), object())
{0: <object object at 0x1001da080>,
 1: <object object at 0x1001da080>}


 类似资料:
  • 描述 (Description) fromkeys()方法创建一个新的字典,其中包含来自seq键和values设置为value。 语法 (Syntax) 以下是fromkeys()方法的语法 - dict.fromkeys(seq[, value]) 参数 (Parameters) seq - 这是用于字典键准备的值列表。 value - 这是可选的,如果提供,则value将设置为此值 返回值

  • When you're managing a team of programmers, one of the first things you have to learn to get right is task allocation. That's just a five-dollar word for giving people things to do. It's known colloqu

  • Mike Murray, a surprisingly hapless HR manager at Microsoft, made a number of goofs, but the doozie was introducing a "Ship It" award shortly after he started the job. The idea was that you would get

  • 问题内容: 我正在使用该方法从服务器检索内容。最近,我遇到了一个问题,其中HTTP响应代码指示错误,但是仍然抛出了流,而不是抛出异常。这导致该错误在执行中出现得更晚,并被证明是红色鲱鱼。据我所知,当您使用此方法打开流时,无法检查HTTP响应代码。 我能找到正确处理此问题的唯一方法是 在 打开流 之前 获取连接: 那你同意吗?是否有任何安全使用openStream的良好条件,或者不建议使用openS

  • 问题内容: 我可能为此冒险。 在我看来,为新类明确指定serialVersionUID是不好的。考虑以下两种情况:在布局应更改的情况下不进行更改,在布局不更改的情况下进行更改。 几乎只在显式的情况下才会更改应更改的位置。在这种情况下,它会导致一些非常细微,难以发现的错误。特别是在开发期间,班级布局经常更改。但是,如果未明确指定,它将改变并且反序列化将大声中断,这很可能是通过清除存储库来解决的。 仅

  • 问题内容: 这是一个设计问题,未提交具体代码来保护我的底部。 使用Hibernate时,标准工作流程如下: 公开会议 开始交易 做生意(读取和修改数据) 提交交易 闭幕会议 可能会重复2-4次。 Session.clear()的合理用例是什么? 答:我遇到的具体问题是一段(大型)代码,该代码可以加载和修改实体,然后清除()会话,实质上是丢弃所做的更改。(要完成的业务任务不包括修改实体,因此代码“有