1

我对 .NET 对象及其用于引用与值类型的框架非常满意。python 对象与 .NET 对象相比如何?具体来说,我想知道相等性obj1 == obj2、散列能力(即能够放入字典)和复制。

例如,在 .NET 中默认情况下,所有对象都是引用类型,它们的相等性和哈希码由它们在内存中的地址确定。此外,将变量分配给现有对象只会使其指向内存中的该地址,因此不会发生昂贵的复制。似乎这对于python来说是一样的,但我并不完全确定。

编辑:

我可以从 2000 年写的 effbot中找到一些有用的信息:

对象

所有 Python 对象都有这个:

  • 唯一标识(一个整数,由 返回id(x)
  • 一个类型(由 返回type(x)
  • 某些内容您无法更改身份。

您无法更改类型。

某些对象允许您更改它们的内容(即不更改标识或类型)。

某些对象不允许您更改其内容(更多内容见下文)。

该类型由一个类型对象表示,它更了解这种类型的对象(它们通常占用多少字节的内存,它们有哪些方法等)。

4

2 回答 2

3

平等

: -如果您尝试比较__cmp__未定义或__eq__定义方法的对象,它将从该对象继承其比较结果。这意味着做相当于做。objecta > bid(a) > id(b)

is关键字还用于查看两个变量是否指向同一个对象。==另一方面,运算符调用它正在比较的对象的or__cmp__方法__eq__

哈希性

: - 如果有为__hash__它定义的方法,则该对象是可散列的。所有基本数据类型(包括字符串和元组)都为它们定义了散列函数。如果没有__hash__为类定义方法,则该类将从 object 继承它的 hash object

复印

: - copy, copy.deepcopy, 以及它们各自的类方法__copy____deepcopy__. 用于copy复制单个对象,复制对象deepcopy的层次结构。deepcopy

在 agf 的建议下进行的编辑。

于 2012-05-04T17:19:53.113 回答
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功能。

于 2012-05-04T17:33:19.003 回答