私はPythonでいくつかの本当に奇妙な動作を発見しました。 は私の生徒の一人は二つのリストに属している要素を見つけることを試みる間違いのいくつかの種類を作った、と彼は書いた:とPythonリストの演算子
list1 and list2
を奇妙な行動には、エラーはPython 3で解雇されていないということです! list1 and list2
は実際にはlist2
の値を持っています。
これには既知の理由はありますか?
私はPythonでいくつかの本当に奇妙な動作を発見しました。 は私の生徒の一人は二つのリストに属している要素を見つけることを試みる間違いのいくつかの種類を作った、と彼は書いた:とPythonリストの演算子
list1 and list2
を奇妙な行動には、エラーはPython 3で解雇されていないということです! list1 and list2
は実際にはlist2
の値を持っています。
これには既知の理由はありますか?
and
単に設けられた二つの値のtruthnessを評価します。 最初の値がTrue
(bool(list1)
参照)の場合、2番目の値が評価されて返されます。最初の引数がFalse
(たとえば[] and list2
)の場合、その値はすぐに返されます。 documentation on Boolean Operationsで
この動作のための論理的根拠は明確に記述されていますand
もor
でもないが、彼らはFalse
とTrue
に戻り値と型を制限するのではなく、最後に評価された引数を返すこと
注意。
s
が空の場合にデフォルト値に置き換える文字列の場合は、s or 'foo'
という式で目的の値が得られます。この動作が、代わりに、提供引数に基づいTrue
/False
値を返すnot
でを発見していないことを
(強調鉱山)
注意。
まあ、彼らは両方の値を持っているならば、「リスト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を返します。
list1 and list2
と尋ねると、__bool__
はlist1
とlist2
となります。 []
はFalse
と評価され、空でないリストはTrue
と評価され、は空リストを見つけるまで(または空リストが見つからない場合)、およびlist2
を順番に検索します。
最後に、and
の式は、and
が失敗する空のリスト、または比較の最後のリストのいずれかに評価されます。これが値としてlist2
を戻す理由です。
興味深いことに、あなたはデフォルト値を設定するためにあなたの利点にこの動作を使用することができます。
def func(arg=None):
if arg is None:
arg = [5]
おかげでたくさん:
これは実質的にやってと同じです。これはまさに私が理解できなかったものです。 –
@Coulombeauようこそ。このような振舞いについては、常にPython Docsを覗いてみてください。通常、そこのどこかに隠されています:-) –