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

來源:互聯網
上載者:User

標籤:注意   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中引用的理解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.