在運用python的過程中,發現當函式引數為list的時候,在函式內部呼叫list.append()會改變形參,與c/c++的不太一樣,查閱相關資料,在這裡記錄一下。
python中id可以獲取物件的記憶體位址
>>> num1 = 10
>>> num2 = num1
>>> num3 = 10
>>> id(num1)
>>> id(num2lbleeseg)
>&glbleesegt;> id(num3)
可以看到num1、num2、num3三個物件指向的是乙個位址,python在這裡採用的是一種叫做引用計數的方式來完成的,很類似c++zhong的智慧型指標,變數賦值給變數相當於同一物件引用計數器+1,而不是重新分配空間。
對於list物件可以看到下面的結果:
>>> list1 = [0,1]
>>> list2 = [0,1]
>>> id(list1)
>>> id(list2)
>>> list3 = list1
>>>id(list3)
list1與list3指向同一空間,list2指向另外的一處位址。
python中的函式傳參是物件傳遞,同時也存在區域性與全域性的問題,在傳參過程中存在兩個規則:
通過引用將引數複製到區域性作用域的物件中,意味著被用來訪問函式引數的變數於提高給函式的物件無關,因為存在乙個複製問題,這和c語言是相同的。而且修改區域性物件不會改變原始資料。
可以在適當位置修改可變物件。可變物件主要就是列表和字典,這個適當位置實質上就是前面分析的區域性子物件的修改不會改變字典物件或者列表物件的id
def incrint(num):
pid(num)
num += 1;
pid(num)
def incrlist(listarg):
pid(listarg)
listarg.append(1);
pid(listarg)
def pid(ar
print id(arg)
num1 = 10
pid(num1)
incrint(num1)
print(num1)
list1 = [0,2]
pid(list1)
incrlist(list1)
print(list1)
結果如下:
python test.py
4299181904
104336979912
[0, 2, 1]
可以看到在函式內部,改變int的數值,則num指向了另一塊記憶體位址,而修改list,則是www.cppcns.com在同一塊記憶體位址。
在python中,物件可分為可變(mutable)和不可變(immutable)兩種型別,元組(tuple)、數值型(number)、字串(string)均為不可變物件,而字典型(dictionary)和列表(list)的物件是可變物件。
所以在傳參過程中要注意下。
本文標題: 老生常談python函式引數的區別(必看篇)
本文位址:
聖杯布局,老生常談
聖杯布局的定義應該是乙個header,乙個footer,中間是container,包含乙個自適應寬度的center,center左邊和右邊各有乙個寬度確定的div,大概是這樣 1 使用普通的css來表現 首先是基本的html header middle left right footer 然後我們簡...
老生常談session,cookie的區別,安全性
一,為什麼session,cookie經常會有人提到 做web開發的人基本上都會用session和cookie,但是僅僅只是會用,並不知道session和cookie的真正的工作原理,都只是憑著感覺來猜測。web開發者只要利用它們來完成工作就行了,所以每個人的理解基本都會有大同小異,我想這就是ses...
老生常談session cookie的區別 安全性
一,為什麼session,cookie經常會有人提到 做web開發的人基本上都會用session和cookie,但是僅僅只是會用,並不知道session和cookie的真正的工作原理,都只是憑著感覺來猜測。web開發者只要利用它們來完成工作就行了,所以每個人的理解基本都會有大同小異,我想這就是ses...