如何检查不变性

rnb*_*guy 8 python mutable immutability python-2.7 python-3.x

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

喜欢isimmutable(a)会返回True,如果a是不可变的,则返回False.

Ser*_*ial 5

对不变性没有一般性测试.仅当对象的任何方法都不能改变基础数据时,对象才是不可变的.

看看这个问题

答案说:

1)密钥不能是可变的,除非你有一个可清除但也可变的用户定义的类.这就是强迫你的一切.但是,使用可散列的可变对象作为dict键可能是个坏主意.

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

3)所有内置的不可变类型都是可清除的.所有内置的可变类型都不可清除.对于可以清除的对象,它必须在其整个生命周期内具有相同的哈希值,即使它已被突变.

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

如果类型不是不可变的,那么它是可变的.如果类型是内置的不可变类型,则类型是不可变的:str,int,long,bool,float,tuple,以及可能还有其他几个我忘记的类型.用户定义的类型总是可变的.

如果一个对象不是不可变的,那么它是可变的.如果一个对象是递归地只包含不可变类型的子对象,则该对象是不可变的.因此,列表元组是可变的; 你不能替换元组的元素,但你可以通过列表界面修改它们,改变整体数据

应该回答你的问题


use*_*ica 5

您想检查不变性或散列性吗?如果你想检查某些东西是否可哈希,请对其进行哈希:

try:
    hash(thing)
except TypeError:
    print "It's unhashable."
else:
    print "It's hashable."
Run Code Online (Sandbox Code Playgroud)

可哈希性通常是您想要的。如果您想检查某些东西是否可变,则没有通用测试。

  • 这个答案是错误的。键不必是不可变的,不可变并不意味着可散列。可散列对象不能以影响“==”测试的方式可变,并且不可变对象不需要提供“__hash__”方法。(从技术上讲,用户定义的“不可变”对象通常是可变初始化的,并且您通常可以通过弄乱其私有数据来改变不应该可变的东西,但大多数情况下,可哈希对象在建造。) (5认同)
  • 哈希性和可变性有什么区别?因为这看起来它可以用于不变性[此处](http://stackoverflow.com/a/4374102/1682673),尽管它被否决了。 (3认同)