python返回物件導致的物件修改問題

2021-10-22 14:41:28 字數 1339 閱讀 9503

注意不要忽略python函式返回物件帶來的 不容易發現的 變數修改問題! 具體問題看下面:

classa(

object):

def__init__

(self)

: self.

buffer=[

1,2,

3]defget_buffer

(self)

:return self.

buffer

defdebug

(self)

:print

(self.

buffer

)def

testa()

:"""

通過return返回的成員變數是直接返回的引用

外部對返回值的修改全部會在類變數裡面直接體現

testa的問題,buf在外部被修改,無意之間導致a的成員被修改,大多數時候,我們希望的返回的buffer是作為「值傳遞」 的方式返回

"""a = a(

) buf = a.get_buffer(

) buf +=[1

,2,3

]print

(buf)

a.debug(

)def

testb()

:"""

解決testa的乙個思路是,在外部使用某些操作,盡可能的避免這樣的問題--->

"""a = a(

) buf =

buf += a.get_buffer(

) buf +=[1

,2,3

]print

(buf)

a.debug(

)def

testc()

: a = a(

)# 加法操作符的返回值是乙個新的list物件,即是:buf'ref != a.get_buffer()'s ref

# 但是+=無返回值,但是其針對於的操作直接作用在本身

buf = a.get_buffer()+

[1,2

,3]print

(buf)

a.debug(

)testa(

)testb(

)testc(

)

輸出如下:

[1, 2, 3, 1, 2, 3]

[1, 2, 3, 1, 2, 3]

[1, 2, 3, 1, 2, 3]

[1, 2, 3]

[1, 2, 3, 1, 2, 3]

[1, 2, 3]

[finished in 0.1s]

C 返回物件

使用const引用的常見原因在於提高效率。方式1vector max const vector v1,const vector v2 方式2 const vector max const vector v1,const vector v2 這裡需要注意三點 首先,返回物件將會呼叫複製建構函式,而返回...

C 返回物件和返回引用

最大的區別在於,返回物件的話會在記憶體中根據返回的型別開闢一塊區域,用返回的值對該記憶體進行初始化,如果是返回的物件,利用拷貝構造來初始化這個區域,但是這塊區域並沒有名字,就是說之後使用者沒辦法訪問到這個區域,也成為無名變數,它只能在接下來的 中進行一次性的用途,要不作為引數傳遞,或者將值列印,再之...

C 返回物件和返回引用

我們發現,在c 中,有些成員函式返回的是物件,而有些函式返回的又是引用。返回物件和返回引用的最主要的區別就是函式原型和函式頭。car run const car 返回物件 car run const car 返回引用 返回物件會涉及到生成返回物件的副本。因此,返回物件的時間成本包括了呼叫複製建構函式...