パイソンの(異なる)内部構造を検査する方法は同じようにそのテスト(==)がありオブジェクトですか?
-
13-09-2019 - |
質問
昨日(「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 - >真)。
組み込みユーティリティ、トリックは、それが私にこれらの異なる内部構造を示していたものは何でも、ありますか?私は一度、私は他の人には1ケース(リストW)との値にポインタを扱ったことが見ているだろうように、オブジェクトのおそらくC-のような宣言を生産しているだろう何か?
解決
あなたはそれぞれのケース(の値よりもポインタに類似)での参照を扱っています。あなたはきっとあなたの心の内容にあなたのオブジェクトの参照をイントロスペクションすることができます - たとえば、あなたがリストを持っており、いずれかの項目が同一の参照であるかどうかを確認したい場合は、
if len(thelist) != len(set(id(x) for x in thelist)): ...
私たちがここでの言及について話していることに注意してください - そう、None
するには、2つの同一の参照、またはint
値17
への2つの同一の参照、また同じアラームをトリガします。もちろん、あなたが同じ不変に複数の参照が罰金であると思われる場合、例えば、最初のパスで、リストからimmutablesを排除し、そのケースを削除するためにイントロスペクト維持することができます - 例えば:ます。
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()
私は投資収益ような深い内省戦略の質問です!
所属していません StackOverflow