Python基礎知識之變數的詳解

2022-09-28 20:48:24 字數 3741 閱讀 2088

在python中,變數名只有在第一次出現的時候,才是定義變數。當再次出現時,不是定義變數,而是直接呼叫之前定義的變數。

第乙個單詞以小寫字母開始,後續單詞的首字母大寫

firstname , lastname

每乙個單詞的首字母都採用大寫字母

firstname , lastname

每個單詞之間用下劃線連線起來

first_name , last_name

開發人員自定義的一些符號和名稱

如:變數名、函式名、類名

識別符號命名規則

1.只能由數字、字母、下劃線組成,且不能以數字開頭

2.不能和python中的關鍵字重名

3.盡量做到見名知義

4.不能使用單字元(i,o)作為變數名,因為太像0和1了

5.函式首字母小寫,類的首字母大寫

1.關鍵字就是在python內部已經使用的識別符號

2.關鍵字具有特殊的功能和含義

3.開發者不允許定義和關鍵字相同的名字的識別符號

注意:1.命名規則tlrxybdxhj可以被視為一種慣例,無絕對與強制,目的是為了增加**的識別和可讀性

2.python中的識別符號是區分大小寫的

3.在定義變數時,為了保證**格式,遵循pep8規範,等號(=)的左右兩邊該各保留乙個空格

變數名 = 值

例:a = 1

在python中賦值語句總是建立物件的引用值,而不是複製物件。因此,python中的變數儲存的是引用資料的記憶體位址,而不是資料儲存區域。

當涉及多個變數時:

a = 1

b = a

c = b

print(a) # 1

print(id(a)) # 140710098927888

print(b) # 1

print(id(b)) # 140710098927888

print(c) # 1

print(id(c)) # 140710098927888

a、b、c三個變數的值都等於1,即使在最初定義變數的時候b和c不是直接等於1的,但是他們仍然儲存著指向「1」的記憶體位址。

可以說python中沒有賦值,只有引用。python 沒有「變數」,我們平時所說的變數其實只是「標籤」,是www.cppcns.com引用。

當建立了無數個變數=1時,在記憶體中,只會開闢無數個空間儲存變數,再開闢乙個空間儲存「1」,而這些變數中儲存的記憶體位址都相同,全都指向「1」的記憶體位址。

在**層面,看起來像是給變數賦值,但是在底層卻是變數指向值,也就是變數引用了值。

相信大家還有疑問,那麼請繼續閱讀

先提出乙個問題:

a = [0, 1, 2]

a[1] = a

print(a)

猜想結果是:

[0, [0, 1, 2], 2]

但是真正的結果是:

[0, [...], 2]

為什麼結果會賦值了無限次??

結合剛才得出的結論:python中沒有賦值,只有引用。

真相是:

這樣相當於建立了乙個引用自身的結構,所以導致了無限迴圈。

通過遞迴函式可能更好理解:

a = [0,1,2]

a[1] = a

def fun1(n1):

for i in n1:

程式設計客棧 if type(i) == list:

return fun1(n1)

else:

print(i)

print(fun1(a[1]))

結果:果然是:呼叫python物件時超出最大遞迴深度。

底層邏輯:a[1] = a 造成了遞迴引用

當呼叫變數a時,就是呼叫[0,1,2],此時 [0,1,2] 的結構變成了 [0,?,2] ,而 ? 又指向 [0,?,2] 本身,以此類推,造成了遞迴呼叫的情況。

所以在遍歷a並輸出的時候會引起超出最大遞迴深度的錯誤。

想得到 [0, [0, 1, 2], 2] 的結果並不難:

a = [0,1,2]

a[1] = a[:]

print(a) # [0, [0, 1, 2], 2]

a[:] = a[0:尾部索引值:1]

生成物件的淺拷貝或者是複製序列,不再是引用和共享變數,但此法只能頂層複製

既然談到了賦值和引用的區別,那就捎帶談一下a = a + 1 和 a += 1 的區別:

直接上**:

a = [1, 2]

b = a

print(id(a)) # 1878561149448

print(id(b)) # 1878561149448

a = a + [1, 2]

print(a, b) # [1, 2, 1, 2] [1, 2]

print(id(a)) # 1878593529288

print(id(b)) # 1878561149448

print ("-------------------")

a = [1, 2]

b = a

print(id(a)) # 1878561149960

print(id(b)) # 1878561149960

a += [1, 2]

print(a, b) # [1, 2, 1, 2] [1, 2, 1, 2]

print(id(a)) # 1878561149960

print(id(b)) # 1878561149960

通過對比發現問題:變數a通過「=」 和 「+=」運算,得到的變數b竟然是不同的,運算後變數a的id竟然也是不同的。

執行a = a + [1, tlrxybdxhj2] 後:

變數b指向的值並未發生改變,而變數a的id發生了變化,值也發生了變化

執行a += [1, 2] 後:

變數a和b的值都發生了改變,而二者的id卻沒有改變

具體原因,看圖說話:

執行a = a + [1, 2] 後,會生成乙個新物件,並在cpu上開闢一塊空間儲存 a + [1, 2] ,然後由a指向它。所以變數a的id發生了變化,值也發生了變化。此時變數b指向的值並未發生改變。

執行a += [1, 2] 後:並不會生成新物件,只是把a原本指向記憶體位址的物件的值改變成了 a + [1, 2],所以變數a和b的值都發生了改變,而二者的id卻沒有改變。

對於可變物件型別和不可變物件型別有不同的結果:

可變物件型別:+=改變了原本位址上物件的值,不改變原本的指向位址;=則改變了原本的指向位址,建立了新的物件,並指向新的位址

不可改變物件型別:都是改變原本的指向位址,指向新建立的物件位址

a = 'abc'

b = a

print(id(a)) # 1629835782384

print(id(b)) # 1629835782384

a = a + 'd'

print(a, b) # abcd abc

print(id(a)) # 1629835853168

print(id(b)) # 1629835782384

print ("-------------------")

a = 'abc'

b = a

print(id(a)) # 1629835782384

print(id(b)) # 1629835782384

a += 'd'

print(a, b) # abcd abc

print(id(a)) # 1629835782384

print(id(b)) # 1629835782384

python 基礎知識之變數

每個 py檔案最好新增下面兩行內容 usr bin env python coding utf 8 注釋 單行注釋 def func args,kwargs pass 或者 x 或者 x 多行注釋 或者 一 定義變數 變數名 相當於門牌號,指向值所在的空間 等號,變數值 name luo male ...

PHP基礎知識之變數

變數特點 1變數不需指定資料型別 弱型別 2變數名必須以 開頭 3命名規則 由英文本母,數字,下劃線組成但不能數字開頭 4對大小寫敏感 變數 name 張三 直接使用變數,不指定資料型別 age 20 輸出變數的值 echo name echo 輸出換行符 echo age 弱型別 變數 name ...

Python變數基礎知識

目錄 所謂變數,是指程式執行過程中其值可以改變的量。舉例 在數學中x和y就是變數,python中不同的是變數不只是儲存數字,它可以儲存任意資料型別的值。關鍵字 是python語言中一些已經被賦予特定意義的單詞,這就要求開發者在開發程式時,不能用這些關鍵字作為識別符號給變數 函式 類 模板以及其他物件...