【问题标题】:Is there a way to inspect the (differing) internal structures of Python objects that test as equal (==)?有没有办法检查测试为相等(==)的 Python 对象的(不同)内部结构?
【发布时间】:2009-11-03 04:04:11
【问题描述】:

昨天我问(“在 Python 2.5 下表现不同的外在相等的集合列表的情况(我认为......)”)为什么列表 W 构造如下:

r_dim_1_based = range( 1, dim + 1)
set_dim_1_based =  set( r_dim_1_based)

def listW_fill_func( val):
    if (val == 0):
        return set_dim_1_based
    else:
        return set( [val])

W = [ listW_fill_func( A[cid])  
            for cid in r_ncells ]

没有像我预期的那样表现。特别是,它的行为不像其他显示与它相等的列表(another_list == W --> True)。

是否有实用程序、技巧、内置程序,可以向我展示这些不同的内部结构?可能会产生类似 C 的对象声明,以便我立即看到我正在处理一种情况下的指针(列表 W)和其他情况下的值?

【问题讨论】:

  • 我还不太明白这个问题。 Python 用对象做所有事情。任何列表都是对象引用的集合。当您比较两个列表时,如果它们的长度相同,并且如果它们各自的对象在比较时返回相等,则列表返回相等。 Python 还有一个is 运算符来检查对象身份;也许您可以使用is 来检查事情以更好地了解发生了什么。
  • @steveha:将对象的浅拷贝称为“值”并将对原始对象的引用称为“指针”是有罪的。问题的关键在于你的第四句话:“如果”我去做了所有这些事情,那么,是的,我可以看到两个看起来相等(通过==)的对象是不同的,但这太像工作了。我想要一个调试工具,以便在一秒钟左右的时间内我可以看到差异。图形,类似于 C 结构的规范,例如---

标签: python list set inspection


【解决方案1】:

您在每种情况下都在处理引用(更类似于指针而不是值)。你当然可以反省你的对象对你内心内容的引用——例如,如果你有一个列表并想检查是否有任何项目是相同的引用,

if len(thelist) != len(set(id(x) for x in thelist)): ...

请注意,我们在这里讨论的是引用——因此,对None 的两个相同引用,或对int17 的两个相同引用,也会触发相同的警报。当然,您可以继续自省以删除这种情况,在第一遍中从列表中删除不可变对象,例如,如果您认为对同一个不可变对象的多个引用很好——例如:

immutyps = int, long, float, tuple, frozenset, str, unicode
mutables = [x for x in thelist if not isinstance(x, immutyps)]
if len(mutables) != len(set(id(x) for x in mutables)):
  cryhavocandletloosethedogsofwar()

但我会质疑这种深度内省策略的投资回报率!

【讨论】:

  • 你好,亚历克斯。我想知道是否有一些简单的方法可以将一个对象提供给一个小引擎并返回一个图形或类似 C 声明的东西,它显示了对象的体系结构。参考昨天的示例,如果我将列表 W1、W2 和 W3 提供给“引擎”,我会看到在 W3 中,所有“未知”项都是对同一变量的引用(指针),而在列表中W1 和 W2,这些项目真的是我想象中的独立集合。
  • 确认。如何编辑评论?在第一句的末尾加上一个动词。
  • 但是我不得不说你的第一个语句是守门员,我会尽量记住id()。
  • @behindthefall,我知道在 SO 中“编辑评论”的唯一方法是:复制它,删除它,发表新评论,粘贴你复制的内容,编辑,点击“添加评论” .无论如何,当然,你可以用你的对象的内部结构制作图表,虽然我不确定你对“C-declaration-like”的意思——你想要什么 C 声明,例如,[[], []]*2 vs @ 987654327@?如果您要求将这些转换为图形的现有模块(更不用说类似 C 的声明,无论这意味着什么),我不知道,抱歉。
  • 您不希望您有一个简单的方法来查看引擎盖下发生的事情,而不是 _repr_() 和 == 告诉您的内容吗?
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2012-06-25
相关资源
最近更新 更多