注意不要忽略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 返回引用 返回物件會涉及到生成返回物件的副本。因此,返回物件的時間成本包括了呼叫複製建構函式...