首頁 > 軟體

淺析Python與Java和C之間有哪些細微區別

2022-08-09 14:02:21

1.變數是什麼

(1)C認為變數應該是容器

傳統的觀點通常將變數比喻成容器,不同型別的容器儲存不同的物質,就如同不同資料型別的變數儲存不同型別的值一樣。

人們用杯子裝水,用籃子裝菜,這一切都是這麼正常。

C也是這樣認為的,它認為變數就和這些容器一樣,int型別的杯子就不能裝double型別的菜,float型別的籃子就不能裝char型別的水。

它也是這樣做的,在C程式中,將不匹配的值賦值給變數是不合法的,這些值有的會被隱式轉換,有的乾脆就辦不了,程式直接撂挑子不幹了。

所以C中的變數分別鮮明,各盡其責,所有變數的空間在誕生時就被分配好,未來將要儲存的資料也被註定。

#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並不認同以往的觀點,它覺得傳統的觀點太刻板了,一個變數的未來不應該在它誕生之際就被限定死了,如同印度的種姓製度一樣。

Python主張各變數之間的平等,變數可以儲存任何型別的資料,Python也確實是這麼做的。

a = 10
print(a)
a = 3.14
print(a)
a = "Hello World!"
print(a)

但一旦認為是變數儲存資料後,儲存空間的分配又成了困擾Python的難題,一向平等的它不知道該按照什麼標準去分配空間,變數們將要儲存的資料型別還未可知,如果現在平均分配空間必然會導致今後的一些問題。

Python冥思苦想,終於有一天它想出了一個神奇的構想,它不必將資料需要的空間分配給變數,它只用給變數留足儲存自己的空間,而資料則單獨找它認領空間,然後將資料空間的地址交給變數保管。這樣一個完全不一樣的分配製度和所有制度就出現了。

// C中的空間地址是與變數繫結的
#include <stdio.h>
int main()
{
	int a = 10;
	int b = 10;
	printf("int型變數a的值為%d,地址為%pn", a, &a);
	printf("int型變數b的值為%d,地址為%pn", b, &b);
	a += 10;
	b += 10;
	printf("變化後變數a的值為%d,地址為%pn", a, &a);
	printf("變化後變數b的值為%d,地址為%pn", b, &b);
	return 0;
}
# Python中的空間地址是與值繫結的
a = 10
b = 10
print(f"變數a的值為{a},地址為{id(a)}")
print(f"變數b的值為{b},地址為{id(b)}")
a += 10
b += 10
print(f"變化後變數a的值為{a},地址為{id(a)}")
print(f"變化後變數b的值為{b},地址為{id(b)}")

(3)Java認為我們不應該關心這個問題

Java打造了一臺功能強大的虛擬機器器,即所謂的JVM,來幫我們解決包括儲存空間分配在內的記憶體管理問題,涉及到記憶體的操作都由JVM來完成,程式設計師不用也不能直接操作記憶體。

Java擔心我們不能合理分配利用空間,所以它用自己的方法解決了這個問題。

2.迴圈與迭代

(1)傳統的迴圈

C是三者中最年長的語言,它的迴圈也很具有代表性,迴圈結構是用來處理一系列相似的事物的,這種重複勞動是十分無趣的,所以C通常是數著數來統計重複的次數,然後看看什麼時候能下班。

它使用一種自增運算來數數,用一個整型變數來儲存次數,為了方便逐個的自增,它發明了i++和++i這種結構來簡化命令,這樣的運算也被後來的許多語言效仿。

#include <stdio.h>
int main()
{
	for (int i = 0; i < 10; i++)//經典的i++自增
	{
		printf("%dn", i);
	}
	return 0;
}

(2)繼承與發展

Java也是一位比較老的語言,但它的資歷沒有C老,自身習慣上也受到C很大的影響,迴圈就是其中之一,C語言中的迴圈在它這裡也能使用。

但它後來就發現了問題,傳統的迴圈要在知道該重複多少次的時候才能按時結束,對於成堆的任務,Java有時候很難事先知道它們有多少。

Java後來發現,是它考慮的太多了,它根本沒必要知道要做多少,甚至沒必要統計自己現在做了多少了,對於固定量的任務,它只要讓迴圈把它們都做完就行了,沒有做完就繼續做,做完了就可以提前下班。

於是Java規定了一個新的迴圈規則,即迭代迴圈。

public class Main {
    public static void main(String[] args) {
        int[] numbers = { 5, 3, 8, 4, 6, 1, 7, 2 };
        //迭代迴圈
        for (int item : numbers) {
            System.out.println(item);
        }
    }
}

這樣的迴圈似乎並不比傳統迴圈更難使用,但那時候的大多數語言還是以傳統迴圈為主,包括我們的Java。

(3)新的問題

在其他語言使用傳統迴圈解決問題時,Python似乎有點愁眉苦臉,它又遇到了新的問題。

在之前對變數處理中,Python選擇為值分配記憶體空間,而不是傳統的只為變數分配空間。在進行重複工作時,工作的計數器會不斷產生新的值,Python要為這些產生的新值都分配空間,在少量的重複工作時,Python感覺還能吃得消,但量級一大,Python就沒有這麼多空間可以分配了。

按照這種分配方式,計數器的每一次++自增都會產生一個新值,都需要為它分配記憶體空間,如果迴圈重複100次,它就要消耗100個資料單位的空間,如果重複1000次呢?10000次呢?Python不敢往下想了,問題迫在眉睫。

Python翻閱古籍,終於找到了以前Java發明的一種不同的迴圈方式,這就是它要找的解決問題的答案。它發明了一個迭代器range來取代之前的自增計數器,迭代器裡的數只有在取用的時候才佔據記憶體,使用完將會在迴圈結束後釋放,這樣一來就能解決記憶體空間的問題了。

# Python迭代迴圈列印0到9
for i in range(10):
    print(i)
// C語言傳統迴圈列印0到9
#include <stdio.h>
int main()
{
	for (int i = 0; i < 10; i++)
	{
		printf("%dn", i);
	}
	return 0;
}

實驗結果正如同Python想的那樣,記憶體空間的無謂損失被降低了。

為了推廣這個新的迴圈方式,它禁用了傳統迴圈,並廢除了i++或是++i自增的用法,鼓勵大家使用迭代器range搭配新的迴圈。

3.尾聲

(1)萬物皆物件

三者中最先提到類與物件這個概念的是我們的Java,它認為萬物皆是類,包括它自己,從此物件導向程式設計橫空出世,但它還要相容傳統的思想,對此它的JVM對傳統的基本資料型別和新的類物件做了不同處理。

對於傳統的基本資料型別,JVM將其存在棧中,而將範例化的物件存在堆中。在函數呼叫時,對於簡單的基本資料型別,JVM進行值傳遞,而對於複雜的物件則採用參照傳遞。

相應的變數在相互賦值的時候,有的物件會不幸失去參照,如果沒有變數參照它,它將變得無法操作,它的存在將沒有意義。Java很貼心地安排了JVM去回收它們,這樣的回收系統同樣也可以用來回收那些不會再被用到的資料。

雖然看起來Java對它們有些不盡人情,用完不需要別人了就回收,但這一切都是為了計算機更好的執行任務。

(2)C的自增

為了更好的適應新的任務,C也學著Java加入了類與物件的功能,C實現了自身的進化,進化成了C++,它在利用類與物件的便利的同時,並不承認萬物皆物件的觀點,這也讓它儲存了C那時程式導向程式設計的風格。

C++封裝了許多常用類來方便我們工作,同時允許我們直接操作記憶體,沒有像JVM虛擬機器器那樣的阻隔,保持著C語言原有的高速,同時更加接近底層。

(3)Python的好名聲

Python是三者中誕生最晚的,它最開始是沒有什麼知名度的,在C與Java面前只能老老實實當小弟。但年輕人還是不一樣,它敢想敢做,首先是實現了各變數之間的平等,讓它們能夠儲存任意資料,然後解決了記憶體空間的相關問題。

除此之外,它開源自己,廣泛吸取大家的意見,Python逐漸變得知名了。

在這些過程中,Python不斷改善自身,變得十分人性化,簡單的語法、便捷的方法,都吸引著其他程式設計師去了解,程式設計師們也能很容易的入門。

現在,Python除了自帶的標準庫外,支援匯入很多的外部庫,大大地拓展了Python的應用範圍。這一切都仰仗它一直以來的好名聲,使得不斷有人前赴後繼貢獻自己的便捷方法,為其編寫外部庫。

現在Python雖然沒有C/C++那樣的速度,但是它的便捷性已經不輸其他老一輩的語言了,程式設計師們在寫小程式的時候會更加青睞它。

到此這篇關於淺析Python與Java和C之間有哪些細微區別的文章就介紹到這了,更多相關Python Java C語言區別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com