Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。自從20世紀90年代初Python語言誕生至今,它逐漸被廣泛應用于處理系統管理任務和Web編程。Python已經成為最受歡迎的程序設計語言之一。2011年1月,它被TIOBE編程語言排行榜評為2010年度語言。自從2004年以后,python的使用率是呈線性增長。
Python在設計上堅持了清晰劃一的風格,這使得Python成為一門易讀、易維護,并且被大量用戶所歡迎的、用途廣泛的語言。
鑒于以上各種優點,忍不住對Python進行了一番學習,略有收獲,分享給大家。
最近對Python 的對象引用機制稍微研究了一下,留下筆記,以供查閱。
首先有一點是明確的:「Python 中一切皆對象」。
那么,這到底意味著什么呢?
如下代碼:
代碼如下:
#!/usr/bin/env python
a = [0, 1, 2] # 來個簡單的list
# 最初,list 和其中各個元素的id 是這樣的。
print 'origin'
print id(a),a
for x in a:
print id(x), x
print '----------------------'
# 我們把第一個元素改改
print 'after change a[0]'
a[0] = 4
print id(a),a
for x in a:
print id(x), x
print '----------------------'
# 我們再把第二個元素改改
print 'after change a[1]'
a[1] = 5
print id(a),a
for x in a:
print id(x), x
print '----------------------'
# 回頭看看直接寫個0 ,id是多少
print 'how about const 0?'
print id(0), 0
運行結果如下:
代碼如下:
PastgiftMacbookPro:python pastgift$ ./refTest.py
Origin
[0, 1, 2]
0
1
2
----------------------
after change a[0]
[4, 1, 2]
4
1
2
----------------------
after change a[1]
[4, 5, 2]
4
5
2
----------------------
how about const 0?
0
從「Origin」部分來看,list 中各個元素的地址之間都正好相差24,依次指向各自的數據——這讓我想到了數組。
當修改a[0] 的值之后,發現,a[0] 的地址發生了變化。也就是說,賦值語句實際上只是讓a[0] 重新指向另一個對象而已。此外,還注意到,a[0] 的地址和a[2]的地址相差48(2個24)。
當再次修改a[1] 之后,同樣地,a[1] 的地址也發生變化,有趣的是,這次a[1] 的地址和a[0] 的地址又相差24,和原先的a[2] 相差72(3個24)。
最后,當直接把數字0的地址打印出來后,發現它的地址和最開始的a[0] 的地址完全一樣。
至此,基本可以說明,就算是list 中的元素,其實也是引用。修改list 中的元素,實際上還是在修改引用而已。
對于Python 中類屬性,有人提到過「類屬性在同一類及其子類之間共享,修改類屬性會影響到同一類及其子類的所有對象」。
聽著挺嚇人,但仔細研究之后,其實倒也不是什么大不了的事情。
新聞熱點
疑難解答