python参数传递,如何让可变参数当作不可变参数传递

引子

众所周知,python中参数传递方式有很多,这些在其他文章中都有所详细陈述,在此不做赘述。(如果你需要了解python参数传递的基本知识,请绕路,相关文章在CSDN很丰富。)但是小编遇到一个问题便是可变参数的传递无法被当作不可变参数处理(python3.8),而我们常常需要这么做。这个问题的解决方案在全站没有找到解决方案,小编特写此文为有需要的人士介绍。

错误示例

def demo(x):
    _x = x
    _x['python'] = 'v3.8'
   print('_x =', _x)


x = {'visual basic': 'v6.0'}  # 字典是可变参数
demo(x)
print('x =', x)

"""
输出结果:
_x = {'visual basic': 'v6.0', 'python': 'v3.8'}
x = {'visual basic': 'v6.0', 'python': 'v3.8'}
"""

如图所示,虽然我们改变的是_x,但是奇怪的是x的值也发生了改变。看似我们对x变量进行了拷贝,但事实上python内部做的却只是引用了x变量的内存地址(因为设计者认为这样做更加快速且节约内存),这样也就可以理解为什么x和_x的值同时改变了。

解决方案

呼,终于到了解决方案了。

我们知道可变参数有且仅有:list,set,dict 三种,针对第一种我们有非常容易想到的解决方案。

def demo(x):
    pass


x = [1, 2, 3]
demo(tuple(x))

将不可变参数转换为可变参数传入,如果我们仅仅将列表参数当作元组使用,这个方案够用,并且更好。但是我们可见setdict是无法不可变化的,于是python为我们留了解决方案。

list,set,dict 都是有copy()方法的,只需对代码进行微小修改。

def demo(x):
    _x = x.copy()
    _x['python'] = 'v3.8'
   print('_x =', _x)


x = {'visual basic': 'v6.0'}  # 字典是可变参数
demo(x)
print('x =', x)

"""
输出结果:
_x = {'visual basic': 'v6.0', 'python': 'v3.8'}
x = {'visual basic': 'v6.0', 'python': 'v3.8'}
"""

copy()方法强制变量开辟新的内存空间,并进行拷贝。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值