[問題] 判斷布林值的問題

看板Python作者 ( )時間6年前 (2018/01/18 09:45), 6年前編輯推噓7(7018)
留言25則, 7人參與, 6年前最新討論串1/3 (看更多)
Hi 各位板友,最近剛開始碰Python,遇上了一個問題,實在不懂為甚麼,懇請各位指點 def abc(): x = False y = 0 if x is True: print('Working, Please try again') else: if y == 0 : x = True print('Start Work') abc() abc() #Start Work #Start Work 不懂為甚麼第二個回應依舊是Start Work,正常來說應該在第一個Start Work運行後就 賦值True給X,第二次應該是Working, Please try again,可是為甚麼會這樣子呢? 懇請各位給予指點,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.156.198 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1516239946.A.C9C.html

01/18 09:50, 6年前 , 1F
因為你x不是全域變數啊…
01/18 09:50, 1F

01/18 09:51, 6年前 , 2F
你abc()的第一行就把x設為False,他當然不會去true
01/18 09:51, 2F
我有嘗試把x y放在方法外,然後第二個判斷 式中return x出去,一樣的結果

01/18 09:56, 6年前 , 3F
放在方法外應該就正確了 貼程式碼吧
01/18 09:56, 3F
x = False y = 0 def abc(x,y): if x is True: print('Working, Please try again.') else: if y == 0 : x = True print('Start Work') return x abc(x,y) abc(x,y) #Start Work #Start Work return用法可能有誤,但刪掉的話結果還是一樣的 ※ 編輯: zuso (180.217.156.198), 01/18/2018 10:02:11

01/18 10:53, 6年前 , 4F
關鍵字:global
01/18 10:53, 4F

01/18 12:32, 6年前 , 5F
小弟我也是新手,給的意見就參考就好。因為x不是globa
01/18 12:32, 5F

01/18 12:32, 6年前 , 6F
l,所以即使在function中更改x為True,出了function
01/18 12:32, 6F

01/18 12:32, 6年前 , 7F
後x依然會和原本一樣。所以如果想讓x在主程式中也可以
01/18 12:32, 7F

01/18 12:32, 6年前 , 8F
跟著function改變,除了設x為global外,也可以維持ret
01/18 12:32, 8F

01/18 12:32, 6年前 , 9F
urn的那個寫法,然後外面呼叫abc()的時候改成X=abc()
01/18 12:32, 9F

01/18 12:32, 6年前 , 10F
,讓x去接應該也可以成功
01/18 12:32, 10F

01/18 12:33, 6年前 , 11F
不過我不知道用X=abc()這樣寫會不會不太好,但確實可
01/18 12:33, 11F

01/18 12:33, 6年前 , 12F
以達到你的需求就是了
01/18 12:33, 12F

01/18 16:01, 6年前 , 13F
return x 要接起來啊…
01/18 16:01, 13F

01/18 16:29, 6年前 , 14F
01/18 16:29, 14F

01/18 16:33, 6年前 , 15F
我覺得python的缺點是 宣告跟賦值比較不好看出來
01/18 16:33, 15F

01/18 16:34, 6年前 , 16F
像你裡面的x=True 是宣告一個local變數x
01/18 16:34, 16F

01/18 16:34, 6年前 , 17F
而不是對外面的x賦值
01/18 16:34, 17F

01/18 17:14, 6年前 , 18F
主要是scope and namespace的觀念 至於宣告或賦值倒也還好
01/18 17:14, 18F

01/19 03:54, 6年前 , 19F
call by value, call by address, call by reference
01/19 03:54, 19F

01/19 03:57, 6年前 , 20F
call by address 好像不是正規用語XD
01/19 03:57, 20F

01/19 03:58, 6年前 , 21F
如果你想要在function內直接修改外面傳進來的參數, 你
01/19 03:58, 21F

01/19 03:58, 6年前 , 22F
需要搞懂上面那幾種的差別
01/19 03:58, 22F

01/19 03:59, 6年前 , 23F
如果是透過接收return值來修改, 那你要擺一個變數來接收
01/19 03:59, 23F

01/19 10:01, 6年前 , 24F
拍謝 我的回應是錯的 忘記x是傳進來的了
01/19 10:01, 24F

01/19 11:42, 6年前 , 25F
感謝各位指點迷津阿XD 觀念釐清了不少~~
01/19 11:42, 25F
文章代碼(AID): #1QN_nAoS (Python)
文章代碼(AID): #1QN_nAoS (Python)