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

我可以使用可变对象作为python中的字典键。这是不允许的吗?

唐威
2023-03-14
问题内容
class A(object):
    x = 4

i = A()
d = {}

d[i] = 2

print d

i.x = 10

print d

我以为只有不可变的对象才可以是字典键,但是上面的对象是可变的。


问题答案:

具有hash方法的任何对象都可以是字典键。对于您编写的类,此方法默认返回基于id(self)的值,并且如果相等性不是由这些类的标识决定的,则将它们用作键可能会让您感到惊讶:

>>> class A(object):
...   def __eq__(self, other):
...     return True
... 
>>> one, two = A(), A()
>>> d = {one: "one"}
>>> one == two
True
>>> d[one]
'one'
>>> d[two]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: <__main__.A object at 0xb718836c>

>>> hash(set())  # sets cannot be dict keys
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

在2.6版中进行了更改:__hash__现在可以设置为None,以将类实例明确标记为不可哈希。[
hash
]

class Unhashable(object):
  __hash__ = None


 类似资料:
  • 有一个问题,为什么他们要求在字典中使用不可变对象作为键。 当我最近使用字典(显然不是为了哈希表)将Xml节点对象作为键放置时,这个问题实际上进入了我的脑海。然后,我在使用过程中多次更新节点。 那么,“使用不可变键”到底意味着什么呢?

  • 问题内容: 我想知道我能否以某种方式使用x,y对作为字典的键 但是我得到了错误: 和错误: 那么..我们怎样才能使其符合标准? 问题答案: 的定义是,即密钥的类型必须符合协议。但是语言指南告诉我们协议可以被类,结构和枚举所采用,即不能被元组所采用。因此,元组不能用作键。 一种解决方法是定义一个包含两个Ints的可哈希结构类型(或您要放入元组的任何内容)。

  • 问题内容: 我需要实现一个可哈希的字典,因此我可以将一个字典用作另一个字典的键。 但是我从一位同事那里得到了一个通知,说“它并不是真正不变的,因此并不安全。您可以使用它,但是它的确使我感到自己像个可悲的熊猫。 因此,我开始环顾四周以创建一个不可变的对象。我没有必要将“ key-dict”与另一个“ key-dict”进行比较。它的唯一用途是用作另一本词典的键。 我想出了以下几点: 我使用以下工具测

  • 问题内容: C#核心库中是否内置可以为我提供不可变字典的内容? 类似于 Java的 东西: 只是为了澄清一下,我并不是要阻止键/值本身被更改,而只是希望字典的结构不会停止更改。如果将IDictionary的任何mutator方法称为(),我都会希望它们快速而响亮地失败。 问题答案: 不,但是包装器很简单: 显然,如果要允许修改值,可以更改上面的this []设置器。

  • 问题内容: 为什么我不能执行以下操作: 我希望它能打印出来,因为我们用它覆盖了实例,但是它根本不做任何事情。甚至不会抛出错误。只是忽略分配。 我了解几乎没有任何人愿意这样做,但是您似乎做不到,这仍然很奇怪。 更新: 我现在知道 为什么 它不起作用,但是我仍然想知道是否有任何方法可以从实例中替换实例。 问题答案: 任何 简单的分配给 任何 的参数 任何 函数的行为确实是在Python以同样的方式:结

  • 本文向大家介绍浅谈Python中的可变对象和不可变对象,包括了浅谈Python中的可变对象和不可变对象的使用技巧和注意事项,需要的朋友参考一下 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的值可以被改变。变量(准确