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);

猜你喜欢

转载自blog.csdn.net/xwx_100/article/details/82703325