Python对象与.NET对象的比较

Python对象与.NET对象的比较,.net,python,.net,Python,我非常熟悉.NET对象及其用于引用和值类型的框架。python对象与.NET对象相比如何?具体来说,我想知道obj1==obj2的相等性、散列能力,即能够输入dict和复制 例如,在.NET中,默认情况下,所有对象都是引用类型,它们的相等性和哈希代码由它们在内存中的地址决定。此外,将变量分配给现有对象只会使其指向内存中的该地址,因此不会发生昂贵的复制。看起来python也是如此,但我不能完全确定 编辑: 平等 但价值平等对对象意味着什么? 我在2000年找到了一些文字: 物体 所有Python对

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

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

编辑:

平等 但价值平等对对象意味着什么? 我在2000年找到了一些文字:

物体 所有Python对象都具有以下特性:

由idx返回的唯一标识为整数 由typex返回的类型 某些内容无法更改标识。 您不能更改类型

某些对象允许您更改其内容,而无需更改 标识或类型,即

有些对象不允许您在下面进一步更改其内容

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

: -如果试图比较未定义_ucmp_uuuuuuuuu或_ueq_uuuuuuuu方法的对象,则该对象将从该对象继承其比较,从而引发错误。这意味着做a>b相当于做ida>idb

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

: -如果为对象定义了_hash__方法,则该对象是可散列的。包括字符串和元组在内的所有基本数据类型都定义了哈希函数。如果没有为类定义_u散列_u方法,则该类将从对象继承其散列

: -copy、copy.deepcopy及其各自的类内方法。使用“复制”复制单个对象,使用“深度复制”复制对象的继承权。深度复制

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

: -如果试图比较未定义_ucmp_uuuuuuuuu或_ueq_uuuuuuuu方法的对象,则该对象将从该对象继承其比较,从而引发错误。这意味着做a>b相当于做ida>idb

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

: -如果为对象定义了_hash__方法,则该对象是可散列的。包括字符串和元组在内的所有基本数据类型都定义了哈希函数。如果没有为类定义_u散列_u方法,则该类将从对象继承其散列

: -copy、copy.deepcopy及其各自的类内方法。使用“复制”复制单个对象,使用“深度复制”复制对象的继承权。深度复制


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

在python中,您可以定义_eq_u方法来处理==运算符

is操作符检查一个对象是否与另一个相同。或者更具体地说,两个变量引用一个或两个对象

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a == b
True
>>> a is b
False
>>> c = a
>>> c is a
True
现在,这个示例使用列表类型,您可以将其视为一个类,该类定义了一个_eq___)方法,该方法比较其所有项的相等性


对于hash,您在类中定义一个_hash__方法,该方法返回标识对象的整数。这在支持哈希的基本类型中也可用。请参阅哈希函数。

在python中,您可以定义uuu eq_uu方法来处理==运算符

is操作符检查一个对象是否与另一个相同。或者更具体地说,两个变量引用一个或两个对象

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a == b
True
>>> a is b
False
>>> c = a
>>> c is a
True
现在,这个示例使用列表类型,您可以将其视为一个类,该类定义了一个_eq___)方法,该方法比较其所有项的相等性


对于hash,您在类中定义一个_hash__方法,该方法返回标识对象的整数。这在支持哈希的基本类型中也可用。请参阅哈希函数。

了解值/引用比较语义:每个对象都有一个唯一的id。a是b相当于ida==idb。当未定义_eq_uuuuuuu或_cmp_uuuuu方法时,相等比较默认为此。对于值/引用比较语义:每个对象都有一个唯一的id。a是b相当于ida==idb。当未定义uuuu eq_uuu或uuu cmp_uuu方法时,相等比较默认为此。没有uuu cmp_uuu或uuuu eq_uuu的对象将继承按标识进行比较的对象比较。对象散列实现也使用标识,所以默认情况下对象是可散列的。copy.deepcopy用于复制对象的层次结构,而不仅仅是对象。
copy可以做到这一点,并且可以通过u_copy _u;进行等效控制。你的答案没有错,但非常不完整,而且有点误导人。你是对的。我应该在邮寄前检查一下这些文件。当我靠近计算机时将进行编辑。没有uuu cmp_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuueq_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。对象散列实现也使用标识,所以默认情况下对象是可散列的。copy.deepcopy用于复制对象的层次结构,而不仅仅是对象。copy可以做到这一点,并且可以通过u_copy _u;进行等效控制。你的答案没有错,但非常不完整,而且有点误导人。你是对的。我应该在邮寄前检查一下这些文件。当我靠近电脑时,我会编辑。