結(jié)論是無法刪除,因為python函數(shù)實際上接收的是對象引用,不是真正對象。直接在函數(shù)中del對象只是刪除了函數(shù)中此對象的變量名到此對象的引用而已,而在函數(shù)外層還是存在此對象的額外引用。所以python的垃圾回收機制不會刪除此對象。
outside_obj = {
'a': 'hello',
}
def del_obj(obj):
del(obj)
del_obj(outside_obj)
print(outside_obj) # {'a': 'hello'}
而且如果說在函數(shù)內(nèi)部將此參數(shù)更改為None值也是不行的,此時只是將此函數(shù)的形參賦值了None,真正的對象在函數(shù)體外部還是存在一個變量引用它。
outside_obj = {
'a': 'hello',
}
def del_obj(obj):
obj = None
del_obj(outside_obj)
print(outside_obj) # {'a': 'hello'}
這點與PHP不一樣,php通過引用傳值&傳遞給函數(shù)的變量,如果函數(shù)內(nèi)部將其改為null,函數(shù)外部變量直線的值也直接改為了null。
$outsideObj = [
'a' => 'hello',
];
function delObj(&$obj)
{
$obj = null;
}
delObj($outsideObj);
var_dump($outsideObj); //NUll
但是,如果在函數(shù)方法中修改此對象,因為傳遞的是引用,所以在函數(shù)內(nèi)部直接修改此對象,函數(shù)外指向此對象的變量也會獲取到修改之后的值.