2017-02-25 28 views
-2
if "link?" or "Link?" in comment.body and comment.id not in comments_replied_to and comment.author != r.user.me(): 
     print ("Link String found " + comment.id) 
     print(comment.body) 
     #comment.reply("Here you go!") 
     print ("Replied to comment ") 
     #time.sleep(600) 

當我運行代碼時,它會跳過第一個「鏈接」,或者說它運行if語句中的代碼,而不管它是否「鏈接?」。在comment.body中找到。我試圖運行代碼:邏輯運算符如何在Python中的if語句中工作?

if (a or b) and c and d 

它在搜索字符串「link?」的位置或字符串「鏈接?」在評論機構。如果找到任何一個,它將運行for循環中的代碼。目前,它的工作原理,如果我有:

if "link?" in comment.body and comment.id not in comments_replied_to and comment.author != r.user.me(): 

所以我知道它是「或」操作符是錯誤的。這只是我習慣於用Java編碼,操作符可以放在括號內。

+3

不是這樣。它是comment.body中的(「link?」或comment.body中的「Link?」)和......。所以在第一次測試中也要用括號括起來。 –

+1

你在這裏放的東西在Java中也不起作用。 Java的語法更加嚴格。 – khelwood

回答

2

以下:

if "link?" or "Link?" in comment.body and comment.id not in comments_replied_to and comment.author != r.user.me() 

變爲這樣的事情:

bool("link") OR ("Link?" in comment.body) AND (comment.id not in...), etc. 

那首 「鏈接」 的值總是要True因爲只有空字符串False -y。


讓我們反彙編吧!

這個問題似乎經常出現,我認爲這是一個檢查Python反彙編程序的好機會!

In [1]: import dis 
In [3]: def func(comment): 
    ...:  if "link?" or "Link?" in comment.body and comment.id not in comments_replied_to and comment.autho 
    ...: r != r.user.me(): 
    ...:   print ("Link String found " + comment.id) 
    ...:   print(comment.body) 
    ...:   #comment.reply("Here you go!") 
    ...:   print ("Replied to comment ") 
    ...:  

In [4]: dis.dis(func) 
    2   0 LOAD_CONST    1 ('link?') 
       3 POP_JUMP_IF_TRUE  60 
       6 LOAD_CONST    2 ('Link?') 
       9 LOAD_FAST    0 (comment) 
      12 LOAD_ATTR    0 (body) 
      15 COMPARE_OP    6 (in) 
      18 POP_JUMP_IF_FALSE  100 
      21 LOAD_FAST    0 (comment) 
      24 LOAD_ATTR    1 (id) 
      27 LOAD_GLOBAL    2 (comments_replied_to) 
      30 COMPARE_OP    7 (not in) 
      33 POP_JUMP_IF_FALSE  100 
      36 LOAD_FAST    0 (comment) 
      39 LOAD_ATTR    3 (author) 
      42 LOAD_GLOBAL    4 (r) 
      45 LOAD_ATTR    5 (user) 
      48 LOAD_ATTR    6 (me) 
      51 CALL_FUNCTION   0 (0 positional, 0 keyword pair) 
      54 COMPARE_OP    3 (!=) 
      57 POP_JUMP_IF_FALSE  100 

看看它是如何說「LOAD CONST」,然後在「POP JUMP IF TRUE」之後。這意味着沒有別的東西會被評估,因爲那個CONST總是會是真的。

相比之下,下面下來,你將會得到:

   6 LOAD_CONST    2 ('Link?') 
       9 LOAD_FAST    0 (comment) 
      12 LOAD_ATTR    0 (body) 
      15 COMPARE_OP    6 (in) 
      18 POP_JUMP_IF_FALSE  100 

這是一個真正的比較是什麼樣子:它使用的二進制運算符in比較CONST與加載ATTR。那些關注的問題:爲什麼這一個POP_JUMP_IF_FALSE而不是POP_JUMP_IF_TRUE像第一個?

你可以在家裏試試!加載dis並開始反彙編!