資料的在記憶體中的位址就是資料的引用。
如果兩個變數為同乙個引用,那麼這兩個變數對應的資料一定相同;
如果兩個變數對應的資料相同,引用不一定相同。
通過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 表示條...