Python中的變量是什么
引言
Python和java中的變量本質不一樣,java的變量可以理解為一個盒子,用來容納我們的對象,使用前要先聲明它,好分配給我們合適的內存空間。Python的變量可以理解為一個標簽,先構造出對象,再將變量貼在對象上。
Python變量沒有類型,對象才有,本質上是指針。同一個變量,可以表示不同對象。
使用案例
"""
a 和 b 都貼在了同一個對象上
"""
a = [1, 2]
b = a
a.append(6)
print(a, b)
print(a is b)
print(id(a), id(b))
result:
[1, 2, 6] [1, 2, 6]
True
1840524096136 1840524096136
is和==的區別
引言
is用來判斷引用是否相同
==用來判斷值是否相等
使用案例
"""
對于小整數 和 較短的字符串多次出現,Python有一種緩存機制
多次出現的對象不再反復創建,后出現的對象直接引用前面的對象
"""
a, b, c, d = 1, 1, -123, -123
print(a is b)
print(c is d)
result:
True
False
a, b = [1, 2, 3], [1, 2, 3]
print(a is b)
print(a == b)
result:
False
True
del和垃圾回收
引言
del語句直接回收變量,將它所貼對象的引用計數器減一。每有一個新變量引用對象,其引用計數器就會加一
引用計數器為 0 的對象會被后續回收
使用案例
a = "hello"
b = a # a,b 兩個標簽都貼在了對象 "hello" 上
"hello"的引用計數器為2
del a # "hello"的引用計數器減一
print(b)
print(a)
result:
hello
NameError: name 'a' is not defined
傳參問題
引言
在學習Java的時候,都討論過傳引用還是傳值的問題
Python中全部都是傳用
使用案例
"""
函數傳參時,實際上是把實參賦值給形參
由形參來完成函數主體的運算
"""
def add(aa, bb):
aa += bb
return aa
a, b = 1, 2
c = add(a, b)
"""
函數調用之后
aa = 1, bb = 2
aa += bb => aa = aa + bb
int 是不可變類型,內存中會增加一塊空間來存儲(aa+bb),然后將aa標簽貼在上面
a 沒變,b也沒變
"""
x, y = [1, 2], [3]
z = add(x, y)
"""
函數調用之后
aa = [1, 2], bb = [3]
結合鴨子類型,以及前面講的魔法函數,可以知道,此時會調用aa.extend(bb)
list是可變類型,直接在原地修改,aa和a都指向[1, 2]
a 變了,b沒變
"""
m, n = (1, 2), (3,)
p = add(m, n)
"""
和整數一樣
"""
print(a, b, c)
print(x, y, z)
print(m, n, p)
result:
1 2 3
[1, 2, 3] [3] [1, 2, 3]
(1, 2) (3,) (1, 2, 3)
默認值問題
返回一個名字列表
def name_list(li=[]):
這里可能對列表做一些包裝
todo
print(id(li)) # for later use
return li
創建出兩個空的名字列表
x = name_list()
y = name_list()
在 x 中添加一個名字
x.append("MetaTian")
print(x, y)
result:
['MetaTian'] ['MetaTian']
我們創建出兩個空的名字列表,稍后給其中一個添加了一個名字。結果,這兩個名字列表是一樣的,我們再來看下二者的id:
print(id(x), id(y))
result:
2499670504072 2499670504072
兩者id是一樣的,說明兩者指向同一個對象,那這個對象又是什么呢?其實它就是函數參數列表中一個變量的默認值,就是那個空列表,可以自己在代碼中打開注釋,打印li的id即可驗證。
Python中,一切皆對象,函數也是一個對象,那么函數是什么類型的呢?
print(type(name_list))
result:
<class 'function'>
當解釋器執行到def關鍵字時,它會結合下面的代碼生成一個函數對象,而我們提供的參數默認值,就被當做對象的一種屬性封裝起來了。于是,后面的兩次函數調用,都是將這個對象賦值給了x, y兩個變量。也就是說x, y指向了同一個對象。
注:喜歡python + qun:839383765 可以獲取Python各類免費最新入門學習資料!
轉載于:https://blog.51cto.com/14186420/2349825