我对不可变类型是多么困惑.我知道该float对象被认为是不可变的,我的书中有这种类型的例子:
class RoundFloat(float):
def __new__(cls, val):
return float.__new__(cls, round(val, 2))
Run Code Online (Sandbox Code Playgroud)
这是因为类结构/层次结构被认为是不可变的吗?意思float是在类的顶部并且是它自己的方法调用.类似于这种类型的例子(即使我的书说dict是可变的):
class SortedKeyDict(dict):
def __new__(cls, val):
return dict.__new__(cls, val.clear())
Run Code Online (Sandbox Code Playgroud)
虽然可变的东西在类中有方法,但是这种类型的例子:
class SortedKeyDict_a(dict):
def example(self):
return self.keys()
Run Code Online (Sandbox Code Playgroud)
另外,对于最后一个class(SortedKeyDict_a),如果我将这种类型的集合传递给它:
d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))
Run Code Online (Sandbox Code Playgroud)
在不调用example方法的情况下,它返回一个字典.SortedKeyDictwith 将其__new__标记为错误.我尝试将整数传递给RoundFloat类,__new__并且它没有标记错误.
我试过搜索互联网,但找不到哈希的含义.
当他们说对象是什么hashable或hashable objects它是什么意思?
我想创建一个由列表索引的字典.例如,我的字典应该如下所示:
D = {[1,2,3]:1, [2,3]:3}
Run Code Online (Sandbox Code Playgroud)
有人知道怎么做吗?如果我只是输入D([1,2,3]) = 1它会返回错误.
[...]如果对象具有在其生命周期内永远不会更改的哈希值,则该对象是可清除的.因此,根据官方定义,即使它具有
__hash__()功能,任何可变的东西都不能被清除.我关于这两个要求的说法是不真实的,因为可清除已经暗示要求是不可变的.
我想确保,我做对了 - 即使是非母语人士 - 所以我希望有人在我弄错的时候纠正我.
假设这门课
class Author(object):
def __init__(self, id, name, age):
self.id = id
self.name = name
self.age = age
def __eq__(self, other):
return self.id==other.id\
and self.name==other.name
def __hash__(self):
return hash(('id', self.id,
'name', self.name))
Run Code Online (Sandbox Code Playgroud)
我明白了,这__eq__允许我将这个类的对象与==运算符进行比较.从马克斯回答我理解,即使我的对象peter = Author(1, "Peter", 33)有一个__hash__它是不可清洗的,因为我可能做的事情peter.age = 43,这意味着它不是不可变的.所以我的类的对象Author是不可编辑的,因此不能用作例如dictionarys中的键?我是否做得对或看起来是否需要更多解释?:-)
我将Python对象定义为"在任何深度都是不可变的"iff
例如((1, 2), (3, 4)),在任何深度都是不可变的,而((1, 2), [3, 4])不是(尽管后者,由于是一个元组,"名义上"是不可变的).
有没有合理的方法来测试Python对象是否"在任何深度都是不可变的"?
测试第一个条件相对容易(例如使用collections.Hashable类,忽略了不正确实现__hash__方法的可能性),但第二个条件更难以测试,因为"容器"对象的异质性,以及迭代他们的"内容"......
谢谢!
给出以下示例,
class A(object):
pass
a = A()
a.x = 1
Run Code Online (Sandbox Code Playgroud)
显然是一个可变的,然后我把一个放入一套,
set([a])
Run Code Online (Sandbox Code Playgroud)
它成功了.为什么我可以将像"a"这样的可变对象放入set/dict中?不应该设置/ dict只允许不可变对象,以便他们可以识别对象并避免重复?
考虑以下Python解释器shell会话:
>>> class D(dict):
... def __hash__(self):
... return id(self)
...
>>> d1 = D({'a': 'b'})
>>> d2 = D({'a1': 'b1'})
>>> t = {d1: 1, d2: 2}
>>> t[d1]
1
>>> t[d2]
2
Run Code Online (Sandbox Code Playgroud)
为什么没有dict的__hash__默认值id()?导致禁止使用可变实体作为字典键的设计决定是什么?