亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么`a == b或c或d`總是評估為True?

為什么`a == b或c或d`總是評估為True?

一只萌萌小番薯 2019-05-23 11:04:32
為什么`a == b或c或d`總是評估為True?我正在編寫一個拒絕訪問未授權用戶的安全系統。import sysprint("Hello. Please enter your name:")name = sys.stdin.readline().strip()if name == "Kevin" or "Jon" or "Inbar":     print("Access granted.")else:     print("Access denied.")它按預期授予對授權用戶的訪問權限,但它也允許未經授權的用戶訪問!Hello. Please enter your name: Bob Access granted.為什么會這樣?我明確表示,只有在與nameKevin,Jon或Inbar相同時才授予訪問權限。我也嘗試過相反的邏輯if "Kevin" or "Jon" or "Inbar" == name,但結果是一樣的。
查看完整描述

2 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

在許多情況下,Python的外觀和行為與自然英語相似,但這是抽象失敗的一種情況。人們可以使用上下文線索來確定“Jon”和“Inbar”是加入動詞“equals”的對象,但Python解釋器更具有文字意識。

if name == "Kevin" or "Jon" or "Inbar":

在邏輯上等同于:

if (name == "Kevin") or ("Jon") or ("Inbar"):

對于用戶Bob來說,相當于:

if (False) or ("Jon") or ("Inbar"):

or運營商選擇以積極的第一個參數真值

if ("Jon"):

由于“Jon”具有正的真值,因此該if塊執行。這就是導致“授予訪問權限”被打印的原因,無論給出的名稱如何。

所有這些推理也適用于表達式if "Kevin" or "Jon" or "Inbar" == name。第一個值為"Kevin"true,因此if塊執行。


有兩種常用方法可以正確構建此條件。

  1. 使用多個==運算符顯式檢查每個值:
    if name == "Kevin" or name == "Jon" or name == "Inbar":

  2. 編寫一系列有效值,并使用in運算符測試成員資格:
    if name in ("Kevin", "Jon", "Inbar"):

一般來說,第二個應該是首選,因為它更容易閱讀,也更快:

In [1]: name = "Inbar"In [2]: %timeit name == "Kevin" or name == "Jon" or name == "Inbar"10000000 loops, best of 3: 116 ns per loopIn [3]:
 %timeit name in ("Kevin", "Jon", "Inbar")10000000 loops, best of 3: 65.2 ns per loop


查看完整回答
反對 回復 2019-05-23
?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

簡單的工程問題,讓我們更進一步。

In [1]: a,b,c,d=1,2,3,4In [2]: a==bOut[2]: False

但是,繼承自語言C,Python將非零整數的邏輯值評估為True。

In [11]: if 3:
    ...:     print ("yey")
    ...:yey

現在,Python構建在該邏輯上,并允許您使用邏輯文字,例如或整數,等等

In [9]: False or 3Out[9]: 3

最后

In [4]: a==b or c or dOut[4]: 3

寫它的正確方法是:

In [13]: if a in (b,c,d):
    ...:     print('Access granted')

為安全起見,我還建議您不要硬編碼密碼。


查看完整回答
反對 回復 2019-05-23
  • 2 回答
  • 0 關注
  • 960 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號