【问题标题】:How to check immutability [duplicate]如何检查不变性[重复]
【发布时间】:2013-07-26 07:15:29
【问题描述】:

在python中,有没有办法检查一个对象是不可变的还是可变的?

like isimmutable(a) 将返回 True,如果 a 是不可变的,则返回 False

【问题讨论】:

  • 我不相信答案。只有答案符合我的需要,是hash(),但没有任何适当的解释就被否决了。
  • 由于immutability完全依赖于方法的实现,所以没有办法知道一个对象是否不可变。
  • 在词汇表页面查看他们的定义:hashable, immutable
  • “因为我没有收到正确的答案” - 你得到了答案。答案是否定的。没有办法判断任意对象是否不可变。
  • 迭代器不可复制,例如。

标签: python python-2.7 python-3.x immutability mutable


【解决方案1】:

没有针对不变性的一般测试。只有当对象的任何方法都不能改变底层数据时,对象才是不可变的。

看看这个question

答案是:

1) 键不能是可变的,除非您有一个用户定义的可散列但也是可变的类。这就是强加给你的一切。但是,使用可散列的可变对象作为 dict 键可能不是一个好主意。

2) 通过不在两个字典之间共享值。可以共享密钥,因为它们必须是不可变的。在复制模块的意义上,复制字典绝对是安全的。在这里调用 dict 构造函数也可以:b = dict(a)。你也可以使用不可变的值。

3) 所有内置的不可变类型都是可散列的。所有内置的可变类型都不是可散列的。对于一个可散列的对象,它必须在其整个生命周期内具有相同的散列,即使它已发生变异。

4) 我不知道;我描述的是 2.x。

如果一个类型不是不可变的,那么它就是可变的。如果一个类型是内置的不可变类型,那么它就是不可变的:str、int、long、bool、float、tuple,可能还有一些我忘记了。用户定义的类型总是可变的。

如果一个对象不是不可变的,那么它就是可变的。如果一个对象递归地仅由不可变类型的子对象组成,则它是不可变的。因此,列表元组是可变的;元组的元素不能替换,但是可以通过列表界面修改,改变整体数据

应该回答你的问题

【讨论】:

  • 所选答案没有具体回答我的问题。虽然this 看起来不错,但它被否决了。你能解释一下吗?
  • 你看下面的答案了吗
  • 不,我需要一个反例。 :P 无论如何,我要求它,有人提供。无论如何,我可能会找到一个可能的答案。你能签入 OP cmets 吗?
【解决方案2】:

您要检查不变性还是哈希性?如果你想检查某些东西是否可以哈希,哈希它:

try:
    hash(thing)
except TypeError:
    print "It's unhashable."
else:
    print "It's hashable."

Hashability 通常是你想要的。如果你想检查某些东西是否可变,没有通用的测试。

【讨论】:

  • 哈希性和可变性有什么区别?因为这看起来它可以用于不变性here,尽管它被否决了。
  • 那个答案是错误的。键不必是不可变的,不可变并不意味着可散列。可散列对象不能是可变的以影响== 测试的方式,并且不可变对象不需要提供__hash__ 方法。 (从技术上讲,用户定义的“不可变”对象通常是可变初始化的,并且您通常可以通过弄乱其私有数据来改变不应该可变的东西,但大多数时候,可哈希对象不会在之后被修改建设。)
  • 非常感谢。我现在明白了。无论如何我找到了一个可能的解决方案,你能检查一下 OP cmets 吗?
猜你喜欢
  • 2015-06-10
  • 2021-11-17
  • 2018-08-13
  • 2012-02-26
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多