標籤:注意 end item 變數 可變 set 方法 inf 執行
資料的在記憶體中的地址就是資料的引用。
如果兩個變數為同一個引用,那麼這兩個變數對應的資料一定相同;
如果兩個變數對應的資料相同,引用不一定相同。
通過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.append(3)
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 = {"name":"wangjie","age":23}
print(id(dict))
a = 10
list.append(dict) # 把dict的引用加入到list中 0x111 的內容是(指向){"name":"wangjie","age":23}
list.append(a) # 把a的引用加入到list中 0x222 的內容是(指向)10
print(list) # list[0] 為0x111 ,內容是(指向)資料{"name":"wangjie","age":23},list[1]的內容0x222,內容是(指向)資料10
a = 20 # 修改了a的值 a的引用發生的變化 0x333
# 但不影響list中的引用指向的值 還是指向0x111 指向{"name":"wangjie","age":23}
# 和0x222 指向 10
print(list)
dict["name"] = "lili" #修改了dict的值 dict為可變資料類型,dict的引用不變,但指向發生變化0x指向0x111,但0x222已經變為{‘name‘: ‘lili‘, ‘age‘: 23}
print(list) # list[0]的內容是 0x111 , 指向資料{‘name‘: ‘lili‘, ‘age‘: 23},list[1]的內容為0x222指向資料 10
3.
list = []
list2 = []
m = 10
def func():
global m
m =20
list2 = [1,2] # 不屬於修改,修改需要通過方法,這種是覆蓋全域變數list2
list.append(1) # 通過append 方法修改,list的引用不變
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
info_list.append(info_dict)
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]
a.append(b) # [1,2,[3,4]]
b.append(a)
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
a.append(1)
print(id(a)) # 2132205131400
print(a) # [[],[],[],[],[],1]
a[0].append(2)
print(id(a[0])) # 2132205131592
print(a) # [[2],[2],[2],[2],[2],1]
a[1].append(3)
print(id(a[1])) # 2132205131592
print(a) # [[2,3],[2,3],[2,3],[2,3],[2,3],1]
python 05 關於對python中引用的理解