关于Python函数传参误区的几点总结
Remeber that arguments are passed by assignment in Python
Python 里的参数是通过赋值传递的
Since assignment just creates references to objects, there's no alias between an argument name in the caller and callee, and so no call-by-reference per se.
赋值时创建了一份对象的引用(也就是地址,id(a)),形参和实参之间不存在别名的关系,本质上不存在引用传递。(Python 不存在值传递/引用传递的概念)
Python 中的变量像是标签,给变量赋值,就是把标签贴在一个物体上,再次赋值就是把标签贴在另一个物体上。变量不存在实体,一旦被设置到另一个物体上,不变的是那些物体(对象)。
想要通过一个函数来修改外部变量的值:
- 通过返回值赋值
- 使用全局变量 (global x)
- 修改 list 或 dict 对象的内部元素
- 修改类的成员变量
示例:
def func(x): print('x=',x,id(x)) y=10 x+=y print('x=',x,id(x)) return x a=5 b=func(a) print('a=',a,id(a)) print('b=',b,id(b))输出结果:
x=5, 1452263216
x=15, 1452236536
a=5, 1452263216
b=15, 1452263536
解读:
这里函数 func 的形参是 x,它只在函数内部有效,即作用域仅在函数中;
变量 a 作为实参 传递给函数 func,所以函数里 x 的值就是 a 的值,但 x 不是 a,只是现在他俩一样。
变量 y 是函数中定义的局部变量,作用域同样仅在函数中
对 x 进行赋值之后,x 的值发生了变化,但不会影响实参 a 的值
函数的返回值是 x 的值,并赋值给了外部的变量 b,所以 b 的值就是 x 的值,但是 b 不是 x,此时 x 已不存在。
Note:本文是学习 Crossion的编程教室的《全菊变量和菊部变量》《关于函数参数传递,80%人都错了》两篇文章的一个小结,文中示例和知识点来源于原文,非原创。
阅读更多- JS中关于把函数作为另一函数的参数的几点小总结
- 关于使用python logging模块的几点总结
- python中关于路径获取的相关函数总结
- JS中关于把函数作为另一函数的参数的几点小总结
- python 关于配置文件,日志,传参总结
- 关于C语言变量和函数命名总结以下几点,大家可以讨论交流一下:
- JS中关于把函数作为另一函数的参数的几点小总结
- JS中关于把函数作为另一函数的参数的几点小总结
- python常用函数大总结
- python-opencv函数总结之(一)threshold、adaptiveThreshold、Otsu 二值化
- 关于name属性目前的几点总结
- 关于 python 的 @property总结和思考
- selenium2.0关于python的常用函数
- 关于VS2008属性配置几点总结
- 关于使用存储过程的好处的几点总结
- 关于system函数返回值的总结
- 初学python简单几点总结 一
- python go php 函数参数传递总结
- 【学习总结】python-DAY4-range()函数
- 关于函数传参问题