我非常熟悉.NET对象及其参考框架和值类型。 python对象如何与.NET对象进行比较?具体来说,我想知道平等obj1 == obj2
,哈希能力(即能够输入词典)和复制。
例如,默认情况下,在.NET中,所有对象都是引用类型,它们的相等和哈希代码由它们在内存中的地址决定。此外,将变量分配给现有对象只会使其指向内存中的该地址,因此不会发生昂贵的复制。对于python来说,这似乎是一样的,但我并不完全确定。
编辑:
is
checks for referential equality, ==
checks for value equality(但值相等对于对象意味着什么?)我能够在2000年找到一些useful info from the effbot:
物件
所有Python对象都有:
- 唯一标识(由
id(x)
返回的整数)- 一种类型(由
type(x)
返回)- 部分内容您无法更改身份。
您无法更改类型。
某些对象允许您更改其内容(不更改 身份或类型,即)。
某些对象不允许您更改其内容(更多信息如下)。
类型由类型对象表示,它更了解 这种类型的对象(它们通常占用多少字节的内存, 他们有什么方法等等。
答案 0 :(得分:3)
__cmp__
或__eq__
方法定义object
继承其比较。这意味着执行a > b
等同于执行id(a) > id(b)
。
is
关键字还用于查看两个变量是否指向同一个对象。另一方面,==
运算符调用它正在比较的对象的__cmp__
或__eq__
方法。
__hash__
方法,则对象是可清除的。所有基本数据类型(包括字符串和元组)都具有为其定义的哈希函数。如果没有为类定义__hash__
方法,则该类将从对象object
继承它的哈希值。
copy
,copy.deepcopy
及其各自的课程方法__copy__
和__deepcopy__
。使用copy
复制单个对象deepcopy
以复制对象的层次结构。 deepcopy
根据agf的建议编辑。
答案 1 :(得分:1)
在python中,您可以定义__eq__
方法来处理==
运算符。
is
运算符检查一个对象是否与另一个对象相同。 (或者更具体地说是引用一个或两个对象的两个变量)
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a == b
True
>>> a is b
False
>>> c = a
>>> c is a
True
现在,此示例使用list
类型,您可以将其视为定义__eq__
方法的类,该方法比较其所有项的相等性。
对于hash,您在类中定义一个__hash__
方法,该方法返回一个标识对象的整数。这也适用于支持散列的基本类型。请参阅hash
功能。