[问题] 判断布林值的问题

楼主: 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