2016-12-17 4 views
0

私は驚きのpythonの動作に出くわしました。なぜ動作するのか理解できません。 誰かがコードの動作を以下で説明するように説明できますか? (それは、私を邪魔するものを紹介するためだけに作られたものです)。Python - 割り当ての驚くべき動作

from typing import List 


def check_if_one_is_in_list(list_of_ints: List[int]=None): 
    if list_of_ints and 1 in list_of_ints: 
     one_in_list = True 
    else: 
     one_in_list = False 

    return one_in_list 


print(check_if_one_is_in_list(list(range(0,10)))) 
# Output: True 

print(check_if_one_is_in_list([2,3,4])) 
# Output: False 

print(check_if_one_is_in_list([])) 
# Output: False 

print(check_if_one_is_in_list()) 
# Output: False 


def check_if_ine_is_in_list_wh00t(list_of_ints: List[int]=None): 
    one_in_list = list_of_ints and 1 in list_of_ints 
    return one_in_list 

print(check_if_ine_is_in_list_wh00t(list(range(0,10)))) 
# Output: True 

print(check_if_ine_is_in_list_wh00t([2,3,4])) 
# Output: False 

print(check_if_ine_is_in_list_wh00t()) 
# Output: None 
#WHY?! 

print(check_if_ine_is_in_list_wh00t([])) 
# Output: [] 
#WHY?! 

は、私は2番目の機能はまた、真/偽のステートメントではなく、空の配列を返すことを期待..

答えて

1

注:

print(None and True) 
# None 
print([] and True) 
# [] 

print(None and False) 
# None 
print([] and False) 
# [] 

、それはあなたがone_in_listを割り当てるものです。 (明示的boolにキャスト)されているもの、あなたのケースで動作します

def check_if_ine_is_in_list_wh00t(list_of_ints): 
    one_in_list = bool(list_of_ints and 1 in list_of_ints) 
    return one_in_list 
0

Noneであなたのデフォルトリスト

def check_if_ine_is_in_list_wh00t(list_of_ints: List[int]=None): 
    one_in_list = list_of_ints and 1 in list_of_ints 
    return one_in_list 

で。 None and Falseを評価している check_if_ine_is_in_list_wh00t()を印刷すると、 Noneが返されます。第二の試験で

print(check_if_ine_is_in_list_wh00t([])) 

コードは[] and Falseを評価し、[]を返します。 Pythonコンソールで確認できます。

最初の関数は、ifが評価されたときの出力がTrueまたはFalseの場合と同じように動作します。それは[]を取得し、NoneはifによってFalseと評価されます。見返りに条件の順序が重要であること

def a(list_of_ints: List[int]=None): 
    return list_of_ints != None and len(list_of_ints)!=0 and 1 in list_of_ints 

注:することができれば使用しないように

ソリューション。おそらくもっと良い解決策があるでしょう。

関連する問題