【问题标题】:Python objects compared to .NET objectsPython 对象与 .NET 对象的比较
【发布时间】:2012-05-04 17:08:36
【问题描述】:

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

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

编辑:

我找到了一些写于 2000 年的 useful info from the effbot

对象

所有 Python 对象都有这个:

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

你不能改变类型。

某些对象允许您更改其内容(无需更改 身份或类型,即)。

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

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

【问题讨论】:

  • 对于值/引用比较语义:stackoverflow.com/questions/132988/…
  • 每个对象都有一个唯一的ID。 a is b 等价于 id(a) == id(b)。当没有定义 __eq____cmp__ 方法时,相等比较默认为这个。

标签: .net python


【解决方案1】:

Equality

: - 未定义 __cmp____eq__ 方法的对象如果您尝试比较它会引发错误,它会从对象 object 继承其比较。这意味着执行a > b 等同于执行id(a) > id(b)

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

Hashability

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

Copying

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

根据 agf 的建议进行的编辑。

【讨论】:

  • 没有__cmp____eq__ 的对象继承objects 比较,它按标识进行比较。 objects __hash__ 实现也使用身份,因此对象默认是可散列的。 copy.deepcopy 是当您想要复制对象的层次结构时,而不仅仅是一个对象。 copy 可以做到这一点,并且可以由 __copy__ 等效控制。您的答案没有错,但它非常不完整且有些误导。
  • 你是对的。我应该在发布之前检查文档。当我靠近计算机时将进行编辑。
【解决方案2】:

在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 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-26
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多