python函数传参意义示例详解

 更新时间:2021年10月12日 15:18:53   作者:zjuPeco  
这篇文章主要为大家介绍了关于python函数传参的意义示例详解,有需要的朋友可以借鉴参考下,希望可以加深各位同学对Python传参的理解

C++这样的语言用多了之后,在Python函数传递参数的时候,经常会遇到一个问题,我要传递一个引用怎么办?
比如我们想要传一个x到函数中做个运算改变x的值:

def change(y):
    y += 1
x = 1
print ("before change:", x)
change(x)
print ("after change: ", x)

得到的结果是

before change: 1
after change:  1

完全没用~~~这是怎么回事?
我来说明一下这个过程~

参数传递

也就是说python中的等号就是把变量指向了一个实例而已。
那么,如何做到其它语言中引用这样的效果呢?一个比较推荐的方法就是用把参数return回去就可以了,如下面代码所示。

def change(y):
    y += 1
    return y

x = 1
print ("before change:", x)
x = change(x)
print ("after change: ", x)

结果为

before change: 1
after change:  2

另一种方法就是,我们不让函数中的参数指向新的地址不就可以了,我们让它在原来的地址上修改我们的值。这一点,只有一部分的数据类型可以做到,我们把这样的对象叫做可变对象,做不到的就叫不可变对象。

  • 不可变对象:int,string,float,tuple 等
  • 可变对象 :list,dictionary 等

举几个例子更为通俗易懂

def change(x):
    print ("before append:", x, "id:", id(x))
    x.append(0)
    print ("after append:", x, "id:", id(x))
x = [1, 2, 3]
print ("before change:", x, "id:", id(x))
change(x)
print ("after change:", x, "id:", id(x))
before change: [1, 2, 3] id: 140623459512008
before append: [1, 2, 3] id: 140623459512008
after append: [1, 2, 3, 0] id: 140623459512008
after change: [1, 2, 3, 0] id: 140623459512008

由于list在做append操作时,x指向的地址是不变的,所以可以有引用的效果,x[0] = 4这样的操作也是没问题的
然而,如果是把x指向了新的地址就不行了,如下

def change(x):
    print ("before equal:", x, "id:", id(x))
    x = [5]
    print ("after equal:", x, "id:", id(x))

x = [1, 2, 3]
print ("before change:", x, "id:", id(x))
change(x)
print ("after change:", x, "id:", id(x))
before change: [1, 2, 3] id: 139683058095432
before equal: [1, 2, 3] id: 139683058095432
after equal: [5] id: 139683058028360
after change: [1, 2, 3] id: 139683058095432

这下应该就搞清楚是怎么回事了吧,不过正是因为python的这种特性,在函数设置默认参数的时候,我们要注意尽量不用可变对象当默认值,否则会发生下面这种情况

def change(x=[]):
    x.append(1)
    return x

print (change())
print (change())

[1]
[1, 1]

比较妥当的做法是用不可变对象来代替[],比如None

def change(x=None):
    if not x:
        x = []
    x.append(1)
    return x

print (change())
print (change())

此时的输出为

[1]
[1]

以上就是python函数传参意义示例详解的详细内容,更多关于python函数传参的资料请关注脚本之家其它相关文章!

相关文章

  • Python装饰器代码详解

    Python装饰器代码详解

    这篇文章主要介绍了python 一篇文章搞懂装饰器所有用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • 超简单的Python HTTP服务

    超简单的Python HTTP服务

    这篇文章主要介绍了超简单的Python HTTP服务的实现过程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Python中比较特别的除法运算和幂运算介绍

    Python中比较特别的除法运算和幂运算介绍

    这篇文章主要介绍了Python中比较特别的除法运算和幂运算介绍,“/”这个是除法运算,那么这个“//”呢?“*”这个是乘法运算,那么这个“**”呢?本文就讲解这些运算的不同,需要的朋友可以参考下
    2015-04-04
  • python统计文本文件内单词数量的方法

    python统计文本文件内单词数量的方法

    这篇文章主要介绍了python统计文本文件内单词数量的方法,涉及Python针对文本文件及字符串的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • Python3的unicode编码转换成中文的问题及解决方案

    Python3的unicode编码转换成中文的问题及解决方案

    这篇文章主要介绍了Python3的unicode编码转换成中文的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Python实现自定义顺序、排列写入数据到Excel的方法

    Python实现自定义顺序、排列写入数据到Excel的方法

    这篇文章主要介绍了Python实现自定义顺序、排列写入数据到Excel的方法,涉及Python针对Excel文件的数据处理及读写相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • Python实现操作Redis所有类型的方法详解

    Python实现操作Redis所有类型的方法详解

    Redis作为一款高性能的NoSQL数据库,越来越受到了广大开发者的喜爱。本篇博客将介绍如何使用Python操作Redis的所有类型,以及一些高级用法,感兴趣的可以了解一下
    2023-04-04
  • 在matplotlib中改变figure的布局和大小实例

    在matplotlib中改变figure的布局和大小实例

    这篇文章主要介绍了在matplotlib中改变figure的布局和大小实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python实现获取内网IP地址的方法总结

    Python实现获取内网IP地址的方法总结

    这篇文章主要为大家详细介绍了五种利用Python语言实现获取内网IP地址的方法,文中的示例代码讲解详细,具有一定的参考价值,需要的可以了解一下
    2023-03-03
  • Django视图之ORM数据库查询操作API的实例

    Django视图之ORM数据库查询操作API的实例

    下面小编就为大家带来一篇Django视图之ORM数据库查询操作API的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论