0

昨天我问(“在 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)和其他情况下的值?

4

1 回答 1

1

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

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

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

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()

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

于 2009-11-03T04:24:03.990 回答