1. 程式人生 > >python也太自動,函式傳遞前會判斷是否要‘值傳遞’,而PHP通通‘值傳遞’

python也太自動,函式傳遞前會判斷是否要‘值傳遞’,而PHP通通‘值傳遞’

一、python

​
# 不可變物件 預設值拷貝
# python裡的值拷貝:把不可變物件所引用的值全部拷貝
# 其它語言的值拷貝:不管你是不是可變不可變,通通給你複製一份
def test_unchanged(a):
    a+=1

a = 1
test_unchanged(a)
print(a) # result: 1


# 可變物件 預設引用傳遞
def test_changed(a):
    a+=[1,2]

a = []
test_changed(a)
print(a) # result: [1, 2]


# 測試 預設的引用傳遞 是深拷貝還是淺拷貝
# 深拷貝:完完全全的盪出一個新空間,把可變物件裡所指向的全部值全部拷貝 注意:python值拷貝不是深拷貝,值拷貝所指物件是不可變,深拷貝所指物件是可變物件
# 淺拷貝:也是盪出一個新空間,但可變物件的第一層的不可變物件值複製進去,第一層的可變物件複製引用
def test_copy(a):
    a[1]+=[1,2]

a = [1,[]]
test_changed(a)
print(a) # result: [1, [1,2]] 可以看出是深拷貝不是淺拷貝

​

二、PHP

$a = 1;
$b = [
    'a '=> 1,
    'b' => 2,
];

// 不可變變數 預設值傳遞
function test_unchanged($a){
    $a += 1;
}

// 可變變數 預設值傳遞
function test_changed($a){
    array_push($a,['c' => 3]);
}

// 那我怎麼改變原來的值
function test_ref_changed(&$a){
    array_push($a, ['c' => 3]);
}

test_unchanged($a);
test_changed($b);
print_r($a);  // result: 1
print_r($b); // result: { a=>1, b=>2 }[2]
test_ref_changed($b);
print_r($b); // result: { a=>1, b=>2, 0=>{ c=>3 }[1] }[3]
$a = "ABC";
$b = &$a;
echo $a;//這裡輸出:ABC
echo $b;//這裡輸出:ABC
$a="EFG";
echo $a;//這裡$a的值變為EFG 所以輸出EFG
echo $b;//這裡輸出EFG
/** result:
 *      ABCABCEFGEFG
 */


$c = array();
$d = &$c;
array_push($c,1);// 如果是python語言,則會是引用
print_r($c);
print_r($d);