python参数传递

当我们在python中使用等号给数组赋值的时候往往会出现一个问题

a = [1, 2, 3]
b = a
print("a数组为:",a)
# a数组为: [1, 2, 3]
print("b数组为:",b)
# b数组为: [1, 2, 3]

正常我们这样使用是没有任何问题的,但是如果我们将原数组 a 进行改变pop出一个栈顶元素

a.pop()
# Out[6]: 3
print("b数组为:",b)
# b数组为: [1, 2]

我们发现 b 数组也改变了,可是我们明明改动的是 a 数组,这是为什么呢?
因为在 python 中 “=”传递的是地址而不是值,所以实际上 b=a 的操作只是将a的地址传给了b,所以改动了值,无论谁来读取都是一样的改变了。
如果我们想完全复制一个互不影响的数组应该怎么办呢?

a = [1, 2, 3]
b[:] = a
a.pop()
# Out[6]: 3
print("b数组为:",b)
# b数组为: [1, 2, 3]

我们使用 b[:] 的方式 就相当于把 a 数组的每一个元素对应的拷贝到 b 中去所以就另开了一块空间存储,这时的a ,b是互不影响的。

这里涉及到一个知识点就是python参数引用的问题(传值\传地址)
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于传址。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,这时就不能直接修改原始对象的值,所以这时候相当于值传递。这也就可以解释为什么 [:]可以直接接收到值传递,因为没有[:]的时候传递的是一整个list的地址,加上了[:]表示的传递的是list中的不可变对象,因此变成了值传递。

所以python的传值和传址是根据传入参数的类型来选择的
传值的参数类型:number,str,tuple
传址的参数类型:list,dict

其实正常我们想要实现复制一个值相等的对象的时候,常用的办法是 copy 和 deepcopy

import copy
a=[1,2,3]
b=copy.copy(a)
a.pop()
print(a,b)
# [1, 2, 3, 4] [1, 2, 3]

我们可以看到使用copy的方法也是可以实现这种复制的,此时a与b值相同地址不同,修改一方不会互相影响,但是当我们复制的对象中存在复杂类型的时候,我们再来看一下

a=[[1,1],2,3]
b=copy.copy(a)
a[0].append(1)
print(a,b)
# [[1,1], 2, 3] [[1,1], 2, 3] 

夭寿了!我们发现又不好使了,面对这种复杂数据类型的时候就要轮到我们的deepcopy出场了

a=[[1,1],2,3]
b=copy.deepcopy(a)
a[0].append(1)
print(a,b)
# [[1,1,1], 2, 3] [[1,1], 2, 3] 

easy as a pie, mission complete!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值