9

ラムダでdelを使用して、実行中のスレッドだけにスレッドのリストを間引くときに問題に気づきました。

map(lambda x: del(x) if not x.isAlive() else x, self.threads)

これは何もしないことを少しの間無視してください。私はmap、reduce、lambdaをいじくり回しているだけです。

これは、del(x)での構文エラーで失敗します。多少の混乱がありますが、問題はdel()が値を返さないことだと思います。たとえば、これは同じエラーで失敗します。

b = 5
x = del(b)

ただし、これはそうではありません。

def rmThis(x): del(x)

これは、この回避策を使用していることを意味します。

map(lambda x: rmThis(x) if not x.isAlive() else x, self.threads)

それで、del()が値を返さないという理由だけで制限はありますか?なぜだめですか?

私はPython2.6.2を使用しています

4

2 に答える 2

14

制限は、それdelステートメントであり、ではないことです。ステートメントはPythonで値を返さないため、「値を返す」ことはありません。

このフォームでは、式についてのみ言及できますが(式の前にlambda暗黙的な関数があるため)、フォームでは、(で行ったように)1行で単一のステートメント関数を指定できます。returndefrmThis

通常del、次のように括弧なしで使用されます。

del x

ただし、許可されているように引数の前後に括弧を含めるdel(x)ことはできますが、それが関数呼び出しであることを意味するわけではありません。

于 2010-05-24T08:17:52.610 に答える
13

2つの問題。最初のものはもっと微妙なので、最初にそれを説明します。

問題は、delが変数バインディングを削除することです。値を渡すことはあなたの目的を果たしません。

これがイラストです

>>> a = 5
>>> del(a)
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> def mydel(x): del(x)
... 
>>> a = 5
>>> mydel(a)
>>> a
5
>>> 

ご覧のように。最初のケースでは、変数 aは現在の名前空間から削除されています。それが指しているオブジェクトを参照する方法はもうありません(他に同じものを指しているものがないと仮定します)。

a2番目のケースでは、名前空間から削除していません。関数の名前空間でのバインディングを削除しxます。その影響により、関数で右辺値として使用できなくなりxます(つまり、未定義の変数になります)。

2番目の問題はSyntaxErrorどちらがより単純かということです。Pythonlambda関数には、ステートメントではなく式のみを含めることができます。del式ではない(つまり、関数呼び出しではない)-ステートメント(del_stmt)であるため、ラムダの本体に表示することはできません。printラムダの本体にを入れようとすると、同じ問題が発生します。

>>> lambda x: print x
  File "<stdin>", line 1
    lambda x: print x
                  ^
SyntaxError: invalid syntax

これは、失敗する理由も説明しx=del(a)ます。ステートメントの構文が無効です。呼び出すことができる関数ではありません。

于 2010-05-24T08:24:23.047 に答える