Python中引數是引用傳遞,還是值傳遞

2021-08-28 05:00:47 字數 1435 閱讀 3671

目前在使用python做開發,有乙個多月了,但是對python的引用傳遞和值傳遞,理解的不是很清楚,前幾天做乙個單子,其中將乙個引數作為初始化值傳遞給乙個介面,結果出了bug。問題主要是這樣的,客戶端做乙個介面,介面上面有三個框,主要是將候選字拖到裡面,那麼在服務端每個人都對應這樣乙個框,也就是需要儲存這個三個框的狀態,需要持久化資料。呼叫的介面的定義如下:

class mycounter(object):

def __init__(self, id):

self.m_data = {}

#isecond是資料持久化時間

def set(self,key, val, isecond):

self.detele(key)

data.m_data[key] = (val, isecond)

def query(self, key, val, default = 0):

data = self.m_data

if data.has_key(key):

return data[key][0]

return default

def delete(self, key):

if self.m_data.has_key(key):

del self.m_data[key]

客戶端開啟介面的時候,我會傳送該框的資料給他,這個時候呼叫了上面的介面

init_words_tble = 

tempdict = user.counter.query("%s.wordsstate" % self.hdname(), init_words_tbl)

#傳送tempdict中的資料到客戶端

客戶端拖資料到框(啟用候選字)中,然後服務端,需要更新人身上的框資料wordsstate

#i表示框的編號,j表示哪個字

def c2sactive(self, i, j):

tempdict = user.counter.query("%s.wordsstate" % self.hdname(), init_words_tbl)

tempdict[i] = j

問題就是出在這裡,這個地方tempdict是引用,這裡如果修改那麼,init_words_tbl將被修改,所以這裡可以如下修改:

tempdict = dict(tempdict)
為什麼會這樣:

變數與物件

有了解釋,則可以知道

tempdict[i] = j

中的tempdict它是引用,他的位址跟之前傳入的init_words_tbl的位址是一致的,如果對他整體賦值,它的位址就會改變,而之前的位址仍然是之前的位址,兩者之間的關聯斷了。這裡還需要說明的是,元組的元素不可以更新,但是元組中的可變的元素可以更新,這裡的元素是字典,屬於可變。

Python引數傳遞 引用傳遞 值傳遞

值傳遞 方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際引數的值。a1 520 a2 a1 print a1 520 print a2 520 a2 a1 1 print a2 521 print a1 520 引用傳遞 也稱位址傳遞,在方法呼叫時,實際上是把引...

python的引數傳遞是值傳遞還是引用傳遞?

函式引數傳遞機制,傳值和引用的是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在堆疊中開闢了記憶體...

python的引數傳遞是值傳遞還是引用傳遞??

函式引數傳遞機制,傳值和引用的是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在堆疊中開闢了記憶體...