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

作者: zuso ( )   2018-01-18 09:45:43
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,可是為甚麼會這樣子呢?
懇請各位給予指點,謝謝
作者: XperiaZ6C (真●安卓輕旗艦)   2018-01-18 09:50:00
因為你x不是全域變數啊…你abc()的第一行就把x設為False,他當然不會去true
作者: vi000246 (Vi)   2018-01-18 09:56:00
放在方法外應該就正確了 貼程式碼吧
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2018-01-18 10:53:00
關鍵字:global
作者: iphone2003 (307)   2018-01-18 12:32:00
小弟我也是新手,給的意見就參考就好。因為x不是global,所以即使在function中更改x為True,出了function後x依然會和原本一樣。所以如果想讓x在主程式中也可以跟著function改變,除了設x為global外,也可以維持return的那個寫法,然後外面呼叫abc()的時候改成X=abc(),讓x去接應該也可以成功不過我不知道用X=abc()這樣寫會不會不太好,但確實可以達到你的需求就是了
作者: KSJ (阿真)   2018-01-18 16:01:00
return x 要接起來啊…
作者: vi000246 (Vi)   2018-01-18 16:29:00
https://goo.gl/3ASbbv我覺得python的缺點是 宣告跟賦值比較不好看出來像你裡面的x=True 是宣告一個local變數x而不是對外面的x賦值
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2018-01-18 17:14:00
主要是scope and namespace的觀念 至於宣告或賦值倒也還好
作者: aszx4510 (wind)   2018-01-19 03:54:00
call by value, call by address, call by referencecall by address 好像不是正規用語XD如果你想要在function內直接修改外面傳進來的參數, 你需要搞懂上面那幾種的差別如果是透過接收return值來修改, 那你要擺一個變數來接收
作者: vi000246 (Vi)   2018-01-19 10:01:00
拍謝 我的回應是錯的 忘記x是傳進來的了
作者: zuso ( )   2018-01-19 11:42:00
感謝各位指點迷津阿XD 觀念釐清了不少~~

Links booklink

Contact Us: admin [ a t ] ucptt.com