python 05 關於對python中引用的理解

2022-09-11 20:30:16 字數 4123 閱讀 7270

資料的在記憶體中的位址就是資料的引用。

如果兩個變數為同乙個引用,那麼這兩個變數對應的資料一定相同;

如果兩個變數對應的資料相同,引用不一定相同。

通過id(資料)可以檢視資料對應的位址,修改變數的值,其實是在修改變數的引用。

資料可以分為:可變型別與不變型別

可變型別:

如果修改了資料的內容,資料的位址沒有發生改變.

有列表,字典,set集合

不可變型別:

如果修改了資料的內容,資料的位址發生改變.

有字串,元組,數字

當python直譯器首次啟動時,會把小數字(-5~256)和短字串(長度小於21)快取到緩衝區中,當在程式中使用這些數字和字串時,就直接從快取區中取。

m = 300

n = 300

print(id(m)) # 1811121856

print(id(n))

不在小數字或者小字串範圍內的資料,會在第一次使用時快取起來

m = 300

n = 300

print(id(m)) # 2345027009360

print(id(n)) # 2345027009360

演示:1.

變數a實際儲存的是1的引用(位址)(在程式執行過程中a被編譯為一條指令)

a = 1

b = a

print(id(a)) # 1820749280

print(id(b)) # 1820749280

a =2 # 修改不可變型別(的引用)

print(id(a)) # 1820749312 a的id已經改變

print(id(b)) # 1820749280

print(a,b)

a = [1, 2,[3,5]]

b = a

print(id(a)) # 1758314288776

print(id(b)) # 1758314288776

a[0] = 6

a[2][0] = 1

b[2][1] = 6

print(id(a)) # 1758314288776 注意a與b始終指向同乙個位址

print(id(b)) # 1758314288776

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

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

2.list =

dict =

print(id(dict))

a = 10

print(list) # list[0] 為0x111 ,內容是(指向)資料,list[1]的內容0x222,內容是(指向)資料10

a = 20 # 修改了a的值 a的引用發生的變化 0x333

# 但不影響list中的引用指向的值 還是指向0x111 指向

# 和0x222 指向 10

print(list)

dict["name"] = "lili" #修改了dict的值 dict為可變資料型別,dict的引用不變,但0x111的內容已經變為

print(list) # list[0]的內容是 0x111 , 指向資料,list[1]的內容為0x222指向資料 10

3.list =

list2 =

m = 10

def func():

global m

m =20

list2 = [1,2] # 不屬於修改,修改需要通過方法,這種是覆蓋全域性變數list2

print(list2) # [1, 2]

print(list) #

print(m) # 10

print(id(m)) # 1811115776

func() # [1, 2]

print(list) # [1]

print(list2) #

print(m) # 20

print(id(m)) # 1811116096

4.def log2():

#info_dict = {} # 儲存學生資訊的字典若放在for迴圈外,則舊資料會被新資料覆蓋

info_list =

num = input("請輸入要錄入資訊的數量")

num = int(num)

for i in range(num):

info_dict = {} # 重新直接對info_dict 賦值,info_dict的引用發生改變 儲存學生資訊的字典要放在for迴圈# 內

print("錄入第%s 位資訊" % (i + 1))

name = input("輸入姓名:")

id = input("輸入學號")

info_dict["姓名"] = name

info_dict["學號"] = id

print(info_list)

for info in info_list:

for k ,v in info.items():

print('%s = %s' % (k,v))

log2()

5.a = [1, 2]

b = [3, 4]

print(a) # [1, 2, [3, 4, [...]]]

print(b) # [3, 4, [1, 2, [...]]]

6.傳遞資料,傳遞的是資料對應的位址.

a = * 5 

print(a) [,,,,]

print(id(a)) # 2132205131400

print(id(a[0])) # 2132205131592

print(id(a[1])) # 2132205131592

print(id(a)) # 2132205131400

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

print(id(a[0])) # 2132205131592

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

print(id(a[1])) # 2132205131592

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

7.>>> def selfadd(a):

"""自增"""

a += a

>>> a_int = 1

>>> selfadd(a_int)

>>> a_int

1>>> a_list = [1,2]

>>> selfadd(a_list)

>>> a_list

[1, 2, 1, 2]

總結:python中函式引數是引用傳遞(注意不是值傳遞)。對於不可變型別,因變數的值不能修改,所以運算不會影響到變數自身;而對於可變型別來說,函式體中的運算有可能

會更改傳入引數的值

8.9.

a = [1,2]

b = a * 2

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

print(id(b))  # 2745079031688

b[0] = 55

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

print(id(b))  # 2745079031688

print(a)  # [1,2]

修改了b[0] ,則b[0] 的引用發生改變,但b的引用沒發生變化 

9.第一種情況:

def func(x,l = ):

for i in range(x):

print(l)

func(3)  #  [1,2,3]

func(2)  # [1,2,3,1,2]

第二種情況:

def func(x,l = ):

for i in range(x):

print(l)

list = [1,2]

func(3,list)  # [1,2,1,2,3]

func(2)  #  [1,2]

函式有預設引數,定義時即為預設引數分配位址了,也只分配這乙個位址,所以第一種情況,用的全是l這個列表;第二種呼叫func(3,list),將list變為了[1,2,1,2,3],然後呼叫func(2),l又指向了原先的已經定義好的空列表,所以結果為[1,2]。

python 05學習筆記

資料儲存棧堆 淺拷貝 只能複製第一層 深拷貝index 找到列表中第一次出現指定元素的下標 4.遍歷列表 ages 11 22,33 44,55 for n in ages print n 元素 for i in range len ages print i,ages i 下標 enumerate ...

python 05 檔案操作

開啟檔案。引數 檔名,訪問模式 f open test.txt w 關閉檔案 f.close f open test.txt w 寫入資料 f.write hello world,i am here f.close 注意 f open test.txt r content f.read 5 prin...

重新學習python05

測試題 0.在 python 中,int 表示整型,那你還記得 bool float 和 str 分別表示什 麼嗎?int 表示整形 bool 布林型 float 浮點型 str 字串 1.你知道為什麼布林型別 bool 的 true 和 false 分別用 1 和 0 來代替 嗎?true 表示條...