引子

众所周知,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):passx = [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()方法强制变量开辟新的内存空间,并进行拷贝。

python参数传递,如何让可变参数当作不可变参数传递相关推荐

  1. 9.可变参数创建不可变集合

    一.可变参数 1.可变参数介绍 可变参数又称参数个数可变,用做方法的形参出现,那么方法参数个数就是可变的了. 方法的参数类型已经确定,个数不确定,我们可以使用可变参数. 2.可变参数定义格式 修饰符 ...

  2. #{}不自动改参数类型_【Just For Fun】C - 可变参数函数、可变参数宏 __VA_ARGS__、额外的逗号

    [Just For Fun] 本系列纯粹娱乐.研究用.一些旁门左道的东西. 事实上可能完全没用. (๑•̀ω•́๑) 對於可变参数函数.可变参数宏 __VA_ARGS__ , 我曾經有在另一些地方寫過 ...

  3. python什么是可变参数_python中的可变参数和不可变参数

    原博文 2016-11-08 21:35 − 知识点:Python中,万物皆对象. python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址. 一.可变对象和不可变对象 Pyth ...

  4. Python学习之路:函数传递可变参数与不可变参数

    函数传参的方法: 太基础了,8说了 直接上重点 一.可变参数的传递 可变参数有:列表.集合.字典 直接上代码: a = [1, 2]def fun(a):print('传入函数时a的值为:', a)a ...

  5. c语言 可变参数的宏,可变参数的宏__ VA_ARGS__的用法

    回顾 在[ANSIC几种特殊的标准定义]中我们讲述了比较常用的几项: __FILE__:正在编译文件的路径及文件名 __LINE__:正在编译文件的行号 __DATE__:编译时刻的日期字符串 如&q ...

  6. c语言宏定义可变参数,C语言可变参数宏定义方法

    http://blog.csdn.net/skyflying2012/article/details/38436711 2014 在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如: 1 2 ...

  7. java 可变参数_90.Java可变参数

    可变参数 JDK中具有可变参数的类Arrays.asList()方法. 分别传多个参.传数组,传数组又传参的情况. 注意:传入基本数据类型数组的问题. 从JDK 5开始, Java 允许为方法定义长度 ...

  8. c 语言 宏 可变 参数,利用C可变参数和宏定义来实现自己的日志系统

    在嵌入式应用的开发过程中,日志系统是非常重要的! 特别是在生产环节出现了偶发性的.与当前的执行环境相关的bug的时候, 如果没有日志系统来追踪问题,很难进行问题重现. 因此,实现一个自己的日志系统是很 ...

  9. python函数可变参数

    Python函数还接收一种参数叫做可变参数,可变参数即任意个参数的意思,可变参数通常使用*args来表示. def func(*args):print('args length = {}, args ...

最新文章

  1. 方法重载-Overload
  2. python语音播报-使用pyttsx3实现python语音播报
  3. chrome浏览器使用技巧
  4. c语言指针输出两个数的最大值和最小值,并求和,有些不清楚这样写为什么不行。
  5. 删除表报正在使用_U盘拔出要不要点quot;安全删除USB硬件quot;退出?
  6. 用C语言实现:判断1000-2000年之间的闰年。
  7. workbench求解闭合状态尼龙槽环
  8. 店宝宝电脑版_母婴店主干货分享:母婴店利润究竟有多大?
  9. 基于springboot房产在线租房管理系统
  10. 2019年终总结与展望
  11. Cube(给出八个点,判断这八个点是否可以构成一个正方体)
  12. 如何在手机上查银行卡号?进来手把手教你!
  13. flash 不显示 旋转 补间动画_【图片】Flash入门5:详解制作补间动画(非传统补间)【flash软件吧】_百度贴吧...
  14. 2019 年第 33 周 DApp 影响力排行榜 | TokenInsight
  15. java 上界和下界,Java 泛型之上界下界通配符
  16. MySQL不小心按到ctrl_凌晨两点,不小心按下了Ctrl键,结果这样了……
  17. 电脑开机停在主板logo画面
  18. 用dd测试SD卡的读写速度
  19. 处理unity第一第三人称游戏中的摄像机穿墙的问题
  20. 微信/微博的图片处理?-android酷炫图片处理(下)

热门文章

  1. OSChina 周二乱弹 ——台风的注意事项
  2. python3爬虫系列03之requests库:根据关键词自动爬取下载百度图片
  3. Murano简介和源码方式安装
  4. 美甲电动打磨机指甲电磨笔方案应用
  5. linux查看硬盘插槽_linux查看硬盘接口方法有哪些
  6. 雨滴蜂窝常用文件标识符
  7. 最经典的解释---中国足球怎么老输
  8. Mysql 日志在线格式化工具
  9. Spring5框架-学习总结(结合个人理解)
  10. IEEE终身会士、外籍院士特邀主讲,第三届消费电子与计算机工程国际学术会议截稿倒计时!