「蛤?!居然當機!」瞪著畫面凍結的螢幕,心裡一面嘀嘀咕咕,一面敲著鍵盤,企圖死馬當活馬醫,看看能不能免去重開機的麻煩。
一切的努力都是徒然,這是徹底的當機!滑鼠、鍵盤完全失去作用,只餘關電源強迫關機一條路可走。
在重開機的當兒,一面看著螢幕有沒有顯示異常的訊息,一面開始分析可能的當機原因。
慘案是在開始執行程式沒多久之後發生的,所以是程式有問題導致的可能性最大。不過,程式其實很簡單,就是讓在畫面上彈彈跳跳的球,當碰到畫面邊界時,就會分裂成為兩顆。除了pygame之外,也沒用到什麼特別的東西,實在是很難想到導致當機的原因。
開機完成,開啟spyder的時候,滿腦子還是剛剛執行程式的畫面。一顆球碰到邊界分裂成兩顆,然後分別沿著不同的方向和路徑彈開。這兩顆球碰到邊界時,又繼續分裂……
「咦?!該不會是因為球的數量太多,導致資源被吃光而當機吧?畢竟那是以等比級數增加的數量,這個可能性很大!」
打開程式,在程式裡頭加了個限制球的數量的條件,同時也修正了另一個錯誤:傳入函數的參數,本來該是tuple,結果傳成pygame.Vector2物件。雖然已先想到程式可能導致問題的原因,但在debug時,還是應該看看是不是有其他錯誤。
程式修改之後,執行起來都沒什麼問題,一堆球在畫面上彈彈跳跳好不快活。這個程式的功能在寫生態系統的人工生命時,可以當作人工生命繁殖功能的基礎。一顆球在某個條件下會變成兩顆,這不就是生命的繁衍嗎?
雖然程式已經可以正常執行,但是不該就此滿足,應該來看看到底球的數量的上限是多少。生命繁殖歸繁殖,但也不可能無限制的增加數量,畢竟資源有限。
試著把球的數量往上調,但很妙的是,儘管球的數量越調越大,但造成的影響,就只是球的移動速度越來越慢,完全不會當機!看來傳錯參數,才是真正導致當機的原因。
在研究球的數量會造成的影響時,又冒出另一個疑問:下面這個程式執行的結果會是什麼?
a = [1, 2, 6, 7]
for i in a:
if i < 5 and len(a) < 10:
a.append(i)
print(a)
是會印出
[1, 2, 6, 7, 1, 2]
還是
[1, 2, 6, 7, 1, 2, 1, 2, 1, 2]
這個疑問,用比較科幻式的陳述方式,就是在問:一個群體中的某些個體在特定條件下會自我複製。如果不強制限制這個群體的個體數量,那這個群體會不會無限制的擴張?
執行程式所印出的a值是後者。所以,會!如果不加以限制,這個群體會無限制的擴張。
為什麼會這樣子?那可能要問Python的創造者為什麼要這樣子設計了。