golang函数的值传递和引用传递

值传递

python对于字符串和数字作为参数传递时,在函数中的值就是直接复制了一个。就像下面这个例子,a和b的地址是同一个但是改变a的值,b的值不会发生改变。

a = 1
b = 1
print("a",a, id(a), "b",b, id(b))
a=2
print("a",a, id(a), "b",b, id(b))
#####输出结果######
a 1 94378359581376 b 1 94378359581376
a 2 94378359581408 b 1 94378359581376

在函数内修改时程序会生成一个新的内存地址存储新的值,所有操作都是在函数内部操作仅仅是局部变量,由于是值传递,所以该函数的对该值所有操作都仅限于该函数内,并没有对参数t1进行修改。详情看下面的实例代码。

def test(a):
    print('a', a, "内存地址", id(a))
    a += "qq"
    print('a', a, "内存地址", id(a))
    a += "ww"
    print('a', a, "内存地址", id(a))

if __name__ == '__main__':
    t1 = "aaaa"
    print("内存地址", id(t1))
    test(t1)
    print('t1', t1, "内存地址", id(t1))
#######运行结果#######
内存地址 140572064233208
a aaaa 内存地址 140572064233208
a aaaaqq 内存地址 140572064249032
a aaaaqqww 内存地址 140572063338224
t1 aaaa 内存地址 140572064233208

Process finished with exit code 0

引用传递

但是当参数为一个列表时,就又会不同。

def test1(b):
    print("b", b,"内存地址", id(b))
    b.append(6)
    print("b", b, "内存地址", id(b))

if __name__ == '__main__':
    t2 = [1,2,3,4,5]
    print("t2", t2,"内存地址", id(t2))
    test1(t2)
    print("t2", t2, "内存地址", id(t2))
#######运行结果##########
t2 [1, 2, 3, 4, 5] 内存地址 139999401054088
b [1, 2, 3, 4, 5] 内存地址 139999401054088
b [1, 2, 3, 4, 5, 6] 内存地址 139999401054088
t2 [1, 2, 3, 4, 5, 6] 内存地址 139999401054088

Process finished with exit code 0

由上面的代码可以看出经过函数的修改t2的值发生改变,但是内存地址没有发生改变,这就相当与c语言中的指针一样,只是把引用传递过去,函数通过引用可以直接操作该值.

简单来说,可以通过函数来直接改变参数的传值为引用传值,反之就是值传递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值