2

リスト内の初期化されていない要素をマークするためのダミー オブジェクトを作成する必要があります (明らかに、辞書の方が適していましたが、メモリの制約が大きいため、リストが必要です)。

この目的のために、次のプロパティを持つオブジェクトを使用することを考えています:

  1. それ自体以外の他のオブジェクトと等しいとは評価されません。
  2. それへの参照は、元の参照から (代入またはパラメーターの受け渡しによる) 以外に作成することはできません。

None最初の要件は満たしますが、2 番目の要件は満たしません (literal を使用してプログラム内の任意の場所に作成できるためNone)。

うまくいくはずのアプローチの1つは、次のとおりです。

  UNINITIALIZED_VALUE = object() # will be compared for == through identity
  a = [1, UNINITIALIZED_VALUE, 2, UNINITIALIZED_VALUE]
  a[1] == a[3] # True
  a[0] == UNINITIALIZED_VALUE # False

このアプローチで潜在的な問題を見逃していないことを再確認したかったのです。(私は Python 3 を使用しています。)

4

2 に答える 2

3

いいえ、それは誰もがそれを行う方法です。ただし、そのようなオブジェクトには任意の属性を設定できないことに注意してください。

于 2012-09-07T05:35:54.167 に答える
0

@Lennart Regebroによる興味深いコメントに返信するには、より多くのスペースが必要なため、回答を作成しているだけです。彼のコメントは私にそれがより適切であるかどうa[0] is UNINITIALIZED_VALUEかについて考えさせました。a[0] == UNINITIALIZED_VALUE

、、、またはその両方UNINITIALIZED_VALUEのサポートを約束するかどうかは、私(設計する開発者)次第だと思います。結局のところ、明示的な約束が与えられない限り、ユーザーは何も想定すべきではありません(文書化されていない動作に依存している場合、実装が変更され、コードが破損する可能性があるため)。is==

isそして実際には、私が(設計者として)両方を約束し==、値が初期化されていないかどうかをテストするために機能する方がよいと思います。のサポート==がないと、ユーザーは次のようなものを書くことができません。

def remove_duplicates(list_):
  return list(set(list_)) # requires that UNINITIALIZED_VALUE supports == 

小さな問題が1つだけあります。の設計者として、LHS上でUNINITIALIZED_VALUE正しく動作することを簡単に保証できます(私の元の1行の実装では動作します)。==ただし、RHS上で正しく動作することを保証することはできません。結局のところ、LHS上のオブジェクトがその比較セマンティクスに夢中になっていて、目に見えるすべてのものと同等に比較する場合、私はそれについて何もできません。間違いなく、そのような攻撃的な振る舞いはほとんどバグです。だから私はこれを小さな問題だと思っています。

于 2012-10-10T20:01:07.440 に答える