python也太自動,函式傳遞前會判斷是否要‘值傳遞’,而PHP通通‘值傳遞’
阿新 • • 發佈:2018-11-03
一、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);