我们都知道函数是可以传参数的,那这里就牵扯出一个问题,传的参数是 值呢还是值的地址呢?我们来看下面两段代码一个是Python的一个是Go的
下面是python的代码我们要做的事情很简单就是看能否改变初值
a=2
b=[1,2,3]
def change(x,y):
x=3
y[0]=4
change(a,b)
print a, b
输出结果: 2 [4, 2, 3];可以看出数字作为一个不可变对象,a的值没有变化,而b作为列表对象,是可变对象,所以b被改变了。
我们在来看Go的表现
func swap(a, b int){
a, b = b, a
}
func main(){
a, b := 1, 2
swap(1, 2)
fmt.Println(a, b) // 1 2
}
通过上述我们可以看到 Go是值传递,值没有改变,那么我们怎么样才能让它改变呢?看下面
func swap(a, b *int){
*b, *a = *a, *b
}
func main(){
a, b := 1, 2
swap(&a, &b)
fmt.Println(a, b) // 2, 1
}
综上所述:Python作为一种动态语言是在运行的时候动态的判断是传值还是传引用,如果你传入的参数对象是可变对象:列表,字典,这个时候就是引用传递,如果参数在函数体内被修改,那么源对象也会被修改。Go作为一种静态语言,是可以自己控制的,希望从这个小概念大家能够明白一些,动静语言的不同之处,大家一起加油!!
网友评论