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


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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值