2016-11-05 6 views
2

私はPythonでいくつかの本当に奇妙な動作を発見しました。 は私の生徒の一人は二つのリストに属している要素を見つけることを試みる間違いのいくつかの種類を作った、と彼は書いた:とPythonリストの演算子

list1 and list2 

を奇妙な行動には、エラーはPython 3で解雇されていないということです! list1 and list2は実際にはlist2の値を持っています。

これには既知の理由はありますか?

答えて

4

and単に設けられた二つの値のtruthnessを評価します。 最初の値がTruebool(list1)参照)の場合、2番目の値が評価されて返されます。最初の引数がFalse(たとえば[] and list2)の場合、その値はすぐに返されます。 documentation on Boolean Operations

この動作のための論理的根拠は明確に記述されていますandorでもないが、彼らはFalseTrueに戻り値と型を制限するのではなく、最後に評価された引数を返すこと

注意。 sが空の場合にデフォルト値に置き換える文字列の場合は、s or 'foo'という式で目的の値が得られます。この動作が、代わりに、提供引数に基づいTrue/False値を返すnotを発見していないことを

(強調鉱山)

注意。

+0

おかげでたくさん:

def func(arg=None): arg = arg or [5] # now, [5] is the default value of arg 

これは実質的にやってと同じです。これはまさに私が理解できなかったものです。 –

+1

@Coulombeauようこそ。このような振舞いについては、常にPython Docsを覗いてみてください。通常、そこのどこかに隠されています:-) –

1

まあ、彼らは両方の値を持っているならば、「リスト1とリスト2の場合:」真を返す必要があり、それがコード内の次の行に継続されます。 は、変数がNoneまたは0 例、その後異なる場合のpython3がTrueと考える:リストはその中に少なくとも1つの要素を持っている場合

a = 1 
if a: #This will be True since a is different then None or 0 
    print("Works") 
>>> Works 

b = 0 
if b: 
    print("Works") 
>>> 
This one returned nothing because b is 0 wich means that the "if b" will return False. 

また、リストにtrueを返します。

1

list1 and list2と尋ねると、__bool__list1list2となります。 []Falseと評価され、空でないリストはTrueと評価され、は空リストを見つけるまで(または空リストが見つからない場合)、およびlist2を順番に検索します。

最後に、andの式は、andが失敗する空のリスト、または比較の最後のリストのいずれかに評価されます。これが値としてlist2を戻す理由です。

興味深いことに、あなたはデフォルト値を設定するためにあなたの利点にこの動作を使用することができます。

def func(arg=None): 
    if arg is None: 
     arg = [5]