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)): ...

ここでは参照について話していることに注意してください。したがって、 への 2 つの同一の参照None、またはintvalueへの 2 つの同一の参照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 に答える