相关疑难解决方法(0)

不可变与可变类型

我对不可变类型是多么困惑.我知道该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__并且它没有标记错误.

python mutable immutability

172
推荐指数
11
解决办法
25万
查看次数

你在Python中使用hashable是什么意思?

我试过搜索互联网,但找不到哈希的含义.

当他们说对象是什么hashablehashable objects它是什么意思?

python

163
推荐指数
6
解决办法
11万
查看次数

在python中创建一个由列表索引的字典

我想创建一个由列表索引的字典.例如,我的字典应该如下所示:

D = {[1,2,3]:1, [2,3]:3}
Run Code Online (Sandbox Code Playgroud)

有人知道怎么做吗?如果我只是输入D([1,2,3]) = 1它会返回错误.

python dictionary

12
推荐指数
1
解决办法
7460
查看次数

关于可清洗对象的说明需要说明

Mark RansomSO中回答了关于哈希SO问题:

[...]如果对象具有在其生命周期内永远不会更改的哈希值,则该对象是可清除的.因此,根据官方定义,即使它具有__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 hash

9
推荐指数
1
解决办法
738
查看次数

如何在Python中测试"任何深度的不变性"?

我将Python对象定义为"在任何深度都是不可变的"iff

  1. 它(名义上)是不可改变的;
  2. 如果它是一个"容器"对象,那么它只包含"在任何深度都是不可变的"对象;

例如((1, 2), (3, 4)),在任何深度都是不可变的,而((1, 2), [3, 4])不是(尽管后者,由于是一个元组,"名义上"是不可变的).

有没有合理的方法来测试Python对象是否"在任何深度都是不可变的"?

测试第一个条件相对容易(例如使用collections.Hashable类,忽略了不正确实现__hash__方法的可能性),但第二个条件更难以测试,因为"容器"对象的异质性,以及迭代他们的"内容"......

谢谢!

python nested immutability hashable

9
推荐指数
1
解决办法
515
查看次数

Python:为什么我可以将可变对象放入dict或set中?

给出以下示例,

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 hash immutability

7
推荐指数
1
解决办法
2333
查看次数

为什么可变实体不能成为字典键?

考虑以下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()?导致禁止使用可变实体作为字典键的设计决定是什么?

python dictionary

1
推荐指数
1
解决办法
472
查看次数

标签 统计

python ×7

immutability ×3

dictionary ×2

hash ×2

hashable ×1

mutable ×1

nested ×1