淺析Python與Java和C之間有哪些細微區(qū)別
1.變量是什么
(1)C認為變量應該是容器
傳統(tǒng)的觀點通常將變量比喻成容器,不同類型的容器儲存不同的物質(zhì),就如同不同數(shù)據(jù)類型的變量存儲不同類型的值一樣。
人們用杯子裝水,用籃子裝菜,這一切都是這么正常。
C也是這樣認為的,它認為變量就和這些容器一樣,int類型的杯子就不能裝double類型的菜,float類型的籃子就不能裝char類型的水。
它也是這樣做的,在C程序中,將不匹配的值賦值給變量是不合法的,這些值有的會被隱式轉(zhuǎn)換,有的干脆就辦不了,程序直接撂挑子不干了。
所以C中的變量分別鮮明,各盡其責,所有變量的空間在誕生時就被分配好,未來將要存儲的數(shù)據(jù)也被注定。
#include <stdio.h> int main() { int a = 10; float b = 3.14; char c = 'm'; printf("a:%d, b:%f, c:%c", a, b, c); return 0; }
(2)Python認為變量應該是標簽
Python并不認同以往的觀點,它覺得傳統(tǒng)的觀點太刻板了,一個變量的未來不應該在它誕生之際就被限定死了,如同印度的種姓制度一樣。
Python主張各變量之間的平等,變量可以存儲任何類型的數(shù)據(jù),Python也確實是這么做的。
a = 10 print(a) a = 3.14 print(a) a = "Hello World!" print(a)
但一旦認為是變量存儲數(shù)據(jù)后,存儲空間的分配又成了困擾Python的難題,一向平等的它不知道該按照什么標準去分配空間,變量們將要存儲的數(shù)據(jù)類型還未可知,如果現(xiàn)在平均分配空間必然會導致今后的一些問題。
Python冥思苦想,終于有一天它想出了一個神奇的構(gòu)想,它不必將數(shù)據(jù)需要的空間分配給變量,它只用給變量留足存儲自己的空間,而數(shù)據(jù)則單獨找它認領(lǐng)空間,然后將數(shù)據(jù)空間的地址交給變量保管。這樣一個完全不一樣的分配制度和所有制度就出現(xiàn)了。
// C中的空間地址是與變量綁定的 #include <stdio.h> int main() { int a = 10; int b = 10; printf("int型變量a的值為%d,地址為%p\n", a, &a); printf("int型變量b的值為%d,地址為%p\n", b, &b); a += 10; b += 10; printf("變化后變量a的值為%d,地址為%p\n", a, &a); printf("變化后變量b的值為%d,地址為%p\n", b, &b); return 0; }
# Python中的空間地址是與值綁定的 a = 10 b = 10 print(f"變量a的值為{a},地址為{id(a)}") print(f"變量b的值為,地址為{id(b)}") a += 10 b += 10 print(f"變化后變量a的值為{a},地址為{id(a)}") print(f"變化后變量b的值為,地址為{id(b)}")
(3)Java認為我們不應該關(guān)心這個問題
Java打造了一臺功能強大的虛擬機,即所謂的JVM,來幫我們解決包括存儲空間分配在內(nèi)的內(nèi)存管理問題,涉及到內(nèi)存的操作都由JVM來完成,程序員不用也不能直接操作內(nèi)存。
Java擔心我們不能合理分配利用空間,所以它用自己的方法解決了這個問題。
2.循環(huán)與迭代
(1)傳統(tǒng)的循環(huán)
C是三者中最年長的語言,它的循環(huán)也很具有代表性,循環(huán)結(jié)構(gòu)是用來處理一系列相似的事物的,這種重復勞動是十分無趣的,所以C通常是數(shù)著數(shù)來統(tǒng)計重復的次數(shù),然后看看什么時候能下班。
它使用一種自增運算來數(shù)數(shù),用一個整型變量來存儲次數(shù),為了方便逐個的自增,它發(fā)明了i++和++i這種結(jié)構(gòu)來簡化命令,這樣的運算也被后來的許多語言效仿。
#include <stdio.h> int main() { for (int i = 0; i < 10; i++)//經(jīng)典的i++自增 { printf("%d\n", i); } return 0; }
(2)繼承與發(fā)展
Java也是一位比較老的語言,但它的資歷沒有C老,自身習慣上也受到C很大的影響,循環(huán)就是其中之一,C語言中的循環(huán)在它這里也能使用。
但它后來就發(fā)現(xiàn)了問題,傳統(tǒng)的循環(huán)要在知道該重復多少次的時候才能按時結(jié)束,對于成堆的任務(wù),Java有時候很難事先知道它們有多少。
Java后來發(fā)現(xiàn),是它考慮的太多了,它根本沒必要知道要做多少,甚至沒必要統(tǒng)計自己現(xiàn)在做了多少了,對于固定量的任務(wù),它只要讓循環(huán)把它們都做完就行了,沒有做完就繼續(xù)做,做完了就可以提前下班。
于是Java規(guī)定了一個新的循環(huán)規(guī)則,即迭代循環(huán)。
public class Main { public static void main(String[] args) { int[] numbers = { 5, 3, 8, 4, 6, 1, 7, 2 }; //迭代循環(huán) for (int item : numbers) { System.out.println(item); } } }
這樣的循環(huán)似乎并不比傳統(tǒng)循環(huán)更難使用,但那時候的大多數(shù)語言還是以傳統(tǒng)循環(huán)為主,包括我們的Java。
(3)新的問題
在其他語言使用傳統(tǒng)循環(huán)解決問題時,Python似乎有點愁眉苦臉,它又遇到了新的問題。
在之前對變量處理中,Python選擇為值分配內(nèi)存空間,而不是傳統(tǒng)的只為變量分配空間。在進行重復工作時,工作的計數(shù)器會不斷產(chǎn)生新的值,Python要為這些產(chǎn)生的新值都分配空間,在少量的重復工作時,Python感覺還能吃得消,但量級一大,Python就沒有這么多空間可以分配了。
按照這種分配方式,計數(shù)器的每一次++自增都會產(chǎn)生一個新值,都需要為它分配內(nèi)存空間,如果循環(huán)重復100次,它就要消耗100個數(shù)據(jù)單位的空間,如果重復1000次呢?10000次呢?Python不敢往下想了,問題迫在眉睫。
Python翻閱古籍,終于找到了以前Java發(fā)明的一種不同的循環(huán)方式,這就是它要找的解決問題的答案。它發(fā)明了一個迭代器range來取代之前的自增計數(shù)器,迭代器里的數(shù)只有在取用的時候才占據(jù)內(nèi)存,使用完將會在循環(huán)結(jié)束后釋放,這樣一來就能解決內(nèi)存空間的問題了。
# Python迭代循環(huán)打印0到9 for i in range(10): print(i)
// C語言傳統(tǒng)循環(huán)打印0到9 #include <stdio.h> int main() { for (int i = 0; i < 10; i++) { printf("%d\n", i); } return 0; }
實驗結(jié)果正如同Python想的那樣,內(nèi)存空間的無謂損失被降低了。
為了推廣這個新的循環(huán)方式,它禁用了傳統(tǒng)循環(huán),并廢除了i++或是++i自增的用法,鼓勵大家使用迭代器range搭配新的循環(huán)。
3.尾聲
(1)萬物皆對象
三者中最先提到類與對象這個概念的是我們的Java,它認為萬物皆是類,包括它自己,從此面向?qū)ο缶幊虣M空出世,但它還要兼容傳統(tǒng)的思想,對此它的JVM對傳統(tǒng)的基本數(shù)據(jù)類型和新的類對象做了不同處理。
對于傳統(tǒng)的基本數(shù)據(jù)類型,JVM將其存在棧中,而將實例化的對象存在堆中。在函數(shù)調(diào)用時,對于簡單的基本數(shù)據(jù)類型,JVM進行值傳遞,而對于復雜的對象則采用引用傳遞。
相應的變量在相互賦值的時候,有的對象會不幸失去引用,如果沒有變量引用它,它將變得無法操作,它的存在將沒有意義。Java很貼心地安排了JVM去回收它們,這樣的回收系統(tǒng)同樣也可以用來回收那些不會再被用到的數(shù)據(jù)。
雖然看起來Java對它們有些不盡人情,用完不需要別人了就回收,但這一切都是為了計算機更好的執(zhí)行任務(wù)。
(2)C的自增
為了更好的適應新的任務(wù),C也學著Java加入了類與對象的功能,C實現(xiàn)了自身的進化,進化成了C++,它在利用類與對象的便利的同時,并不承認萬物皆對象的觀點,這也讓它保存了C那時面向過程編程的風格。
C++封裝了許多常用類來方便我們工作,同時允許我們直接操作內(nèi)存,沒有像JVM虛擬機那樣的阻隔,保持著C語言原有的高速,同時更加接近底層。
(3)Python的好名聲
Python是三者中誕生最晚的,它最開始是沒有什么知名度的,在C與Java面前只能老老實實當小弟。但年輕人還是不一樣,它敢想敢做,首先是實現(xiàn)了各變量之間的平等,讓它們能夠存儲任意數(shù)據(jù),然后解決了內(nèi)存空間的相關(guān)問題。
除此之外,它開源自己,廣泛吸取大家的意見,Python逐漸變得知名了。
在這些過程中,Python不斷改善自身,變得十分人性化,簡單的語法、便捷的方法,都吸引著其他程序員去了解,程序員們也能很容易的入門。
現(xiàn)在,Python除了自帶的標準庫外,支持導入很多的外部庫,大大地拓展了Python的應用范圍。這一切都仰仗它一直以來的好名聲,使得不斷有人前赴后繼貢獻自己的便捷方法,為其編寫外部庫。
現(xiàn)在Python雖然沒有C/C++那樣的速度,但是它的便捷性已經(jīng)不輸其他老一輩的語言了,程序員們在寫小程序的時候會更加青睞它。
到此這篇關(guān)于淺析Python與Java和C之間有哪些細微區(qū)別的文章就介紹到這了,更多相關(guān)Python Java C語言區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python數(shù)組排序方法之sort、sorted和argsort詳解
這篇文章主要給大家介紹了關(guān)于python數(shù)組排序方法之sort、sorted和argsort的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-03-03python3使用tkinter實現(xiàn)ui界面簡單實例
使用tkinter創(chuàng)建一個小窗口,布置2個按鈕,一個btn關(guān)閉窗口,另一個btn用于切換執(zhí)行傳入的2個函數(shù),簡單的小代碼,大家參考使用吧2014-01-01Python爬蟲基礎(chǔ)之XPath語法與lxml庫的用法詳解
這篇文章主要給大家介紹了關(guān)于Python爬蟲基礎(chǔ)之XPath語法與lxml庫用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-09-09