tag:blogger.com,1999:blog-38122661.post2889971721083905959..comments2023-05-23T16:36:13.183+08:00Comments on 拜Python教之Django光明會支部 [ 使徒提姆@Python ]: [tips] python2與python 3的list comprehensions之差異使徒提姆 !?http://www.blogger.com/profile/07429567259240612236noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-38122661.post-30616639665504353462010-09-11T00:12:53.842+08:002010-09-11T00:12:53.842+08:00x =20;
def tl2():
x=15
print x
tl2()
print...x =20;<br />def tl2():<br /> x=15<br /> print x<br />tl2()<br />print tl2.x<br /><br />>>>AttributeError: 'function' object has no attribute 'x'<br /><br />用這個範例我清楚明白了.這樣有error,所以兩個變數是完全不同的,一個是class var,another is local var, scope決定了這個var的visible range. 在global scope產生的var是能被local scope存取. 感謝您的解釋 : )James Yanghttps://www.blogger.com/profile/14769662676162018499noreply@blogger.comtag:blogger.com,1999:blog-38122661.post-76172881715152556642010-09-10T23:51:11.495+08:002010-09-10T23:51:11.495+08:00"因為tl被python視為一個function object,所以x雖然是local v..."因為tl被python視為一個function object,所以x雖然是local variable,tl.x則被視為是其class variable,x跟tl.x是兩個不同scope的變數,"<br /><br />非常critcial 的point, 這樣來看python是所有的一切都是object. <br />我在做了個測試補上 print tl.a得到了這個結果,<br />AttributeError: 'function' object has no attribute 'a'<br />最後試著解釋一下:整個"tl.x"是class variable, x is local var, 但兩者變數是共用同一個值20, That means different var name and type but reference the same value?James Yanghttps://www.blogger.com/profile/14769662676162018499noreply@blogger.comtag:blogger.com,1999:blog-38122661.post-74967555768689740062010-09-08T14:02:48.719+08:002010-09-08T14:02:48.719+08:00list comprehension並不是function而是個statement,不過在pytho...list comprehension並不是function而是個statement,不過在python2裡卻有影響scope內同名變數的副作用, 這個問題在python3已經被解決了, 此外你提的測試中, 因為tl被python視為一個function object,所以x雖然是local variable,tl.x則被視為是其class variable,x跟tl.x是兩個不同scope的變數,而j本身也是個local variable, 所以x,j都無法在function的scope外被存取到,但tl.x可以. 希望這樣有回答到你的問題.使徒提姆 !?https://www.blogger.com/profile/07429567259240612236noreply@blogger.comtag:blogger.com,1999:blog-38122661.post-81926600556643125012010-09-07T19:27:04.838+08:002010-09-07T19:27:04.838+08:00Hi, 拜讀過您在 Django 初接教學的影片後, 非常感謝您的speech帶給我的幫助. 最後想...Hi, 拜讀過您在 Django 初接教學的影片後, 非常感謝您的speech帶給我的幫助. 最後想問這個article討論的內容是不是因為 list comprehension 是有 local scope 的function, 才會去改變相對於被當作global variable x的value?<br />當然在tl function外, x 自然是local 變數, 另外自己做了一個測試:<br /><br />def tl():<br /> x = 5<br /> j = 9<br /> tl.x = 20<br /> [0 for tl.x in [1,2,3]]<br /> print x<br /> <br />tl()<br />print tl.x<br />print j<br /><br />j 會有error, 為何tl.x 不會有呢?<br />是因為把call tl.x 當作call method底下的local var嗎?<br />最後這樣tl.x 在外部能算是object嘛?<br />還是這只是調用method下name是x的變數而已?<br /><br />python 是相當純物件導向的語言,跟之前學過的java 和c 來講, 需要釐清一些細部觀念, 在此感謝指教。James Yanghttps://www.blogger.com/profile/14769662676162018499noreply@blogger.comtag:blogger.com,1999:blog-38122661.post-45792608477840131892010-03-11T13:08:34.630+08:002010-03-11T13:08:34.630+08:00越來越偷懶了越來越偷懶了Anonymousnoreply@blogger.com