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