您的位置:首页 > 编程语言 > Python开发

关于Python函数传参误区的几点总结

2018-06-14 10:55 931 查看

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 中的变量像是标签,给变量赋值,就是把标签贴在一个物体上,再次赋值就是把标签贴在另一个物体上。变量不存在实体,一旦被设置到另一个物体上,不变的是那些物体(对象)。


想要通过一个函数来修改外部变量的值:

  1. 通过返回值赋值
  2. 使用全局变量  (global x)
  3. 修改 list 或 dict 对象的内部元素
  4. 修改类的成员变量

示例:

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%人都错了》两篇文章的一个小结,文中示例和知识点来源于原文,非原创。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: