引子

首先来看一个列子:

def change(val):val.append(100)val = ['T', 'Z', 'Y']
nums = [0, 1]
change(nums)
print(nums)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

猜猜结果应该是什么? 
如果Python函数参数的传递是传值的话,结果应该是[0, 1],如果是传引用的话,结果应该是[‘T’, ‘Z’, ‘Y’]。 
可是实际结果是:[0, 1, 100]。所以,Python函数参数的传递既不是传值也不是传引用。

Python函数参数传递

那么Python中函数参数到底是以什么形式传递的呢? 
我们首先明确一些概念:Python中的变量和对象。 
Python中的变量是没有类型的,我们可以把它看做一个(*void)类型的指针,变量是可以指向任何对象的,而对象才是有类型的。 
而且Python中的对象有可变对象(number,string,tuple等)和不可变对象之分(list,dict等)。 
比如下面的例子:

nums = (1, 2, 3)
type(nums) #输出:tuple
id(nums) #输出:59179256
nums = [1, 2, 3]
type(nums) #输出:list
id(nums) #输出:59094960
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

可以看到nums是没有类型的,它可以指向一个tuple也可以指向一个list,从id就可以看出nums指向了不同的对象。 
明白了这个概念,那么我们可以说Python中函数参数的传递是传递的变量的值。 
而且我们有下面的规律: 
1. 不可变对象作为函数参数,相当于C系语言的值传递。 
2. 可变对象作为函数参数,相当于C系语言的引用传递。

例子分析

下面我们分析几个例子: 
1. 不可变对象

def change(val):val = 0
num = 1
change(num)
print(num) #输出结果为1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

按照上面的规律1,输出结果为1。我们分析一下为什么。 
 
我们定义了一个变量num,num指向数字1,然后执行change函数的时候,复制了num变量到val,即刚进入函数体的时候val仍然指向数字1,然后函数体中给val赋值2,因为数字是不可变对象,所以val重新指向了0。但是作为num变量,仍然指向1。 
2. 可变对象

def change(val):val.append(1)
nums = [0]
change(nums)
print(nums)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5


这里例子同样的道理,刚进入change函数体的时候,val指向列表[0],因为列表是可变对象,所以给[0]执行append操作的时候,直接作用在原来的list上不会生成新的对象,所以返回结果是[0, 1]。 
3. 引子中的例子 

开始的时候,nums指向列表[0],然后进入函数体change的时候,val指向列表[0],然后执行append,列表[0]变成[0, 1],然后又将[‘T’, ‘Z’, ‘Y’]赋值给val,所以最后的结果是nums指向的[0]变成了[0, 1]。

所以最重要的一点是明白:Python中函数参数的传递是传递的变量的值;Python中变量和对象的不同。

Python函数参数传递:传值还是传引用相关推荐

  1. 【中级软考】函数参数传递传值与传引用的区别(global关键字,函数内定义全局变量)

    传值调用最显著的特征就是被调用的函数内部对形参的修改不影响实参的值. 引用调用是将实参的地址传递给形参,使得形参的地址就是实参的地址. (对于python而言,普通的实参传个变量(或常量)进去就相当于 ...

  2. java的函数传值_java 函数形参传值和传引用的区别[转]

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. publicclassTestFun { publicstaticvoidt ...

  3. 经典 Python参数传递采用的肯定是“传对象引用”的方式。相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象

    python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用"的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或 ...

  4. python中函数的参数传递(传值还是传引用)

    函数的参数传递 函数参数传递有两种方式,传值和传引用,传值只是把变量的值复制一份给了实参,函数内部的操作不会改变函数外部变量的值,而传引用传递的是外部变量的地址,函数内部直接操作函数外部变量的储存空间 ...

  5. 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的

    python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...

  6. python函数传值还是地址_python中给函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  7. python传参是传值还是传引用

    在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象.而变量是对象的一个引用(又称为名字或者标签),对象的操作都是通过引用来完成的.例 ...

  8. php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解

    在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助. php中引用的用法: 1. 变量的引 ...

  9. php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解_PHP教程

    在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助. php中引用的用法: 1. 变量的引 ...

最新文章

  1. Python 技术篇-index()字符串倒叙匹配获取索引,字符串切片反向输出,逆向输出字符串
  2. 国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?
  3. 硬核技能k8s初体验
  4. win8f8修复计算机,Win8怎么在启动时按F8出现修复计算机选项
  5. 看似简单的hashCode和equals面试题,竟然有这么多坑!
  6. 算法学习--二叉查找树
  7. 读《编码-藏匿在计算机软硬件背后的语言》有感
  8. ADO.NET - Optimistic Pessimistic Concurrency
  9. ios8升级ios12教程_iOS Hello World示例教程
  10. java单元测试之如何实现异步接口的测试案例
  11. python移动文件到新的文件夹并重命名
  12. vite 预编译实现
  13. 基于高通量测序开发甘蓝型油菜全基因组SSR标记
  14. 国内jQuery CDN
  15. NOC2021年测试卷3
  16. vue自定义html模板,vue中自定义html文件的模板
  17. 及时备份数据可以保护计算机系统吗,电脑数据的保护和备份
  18. 【ZHYP005】子涵优品开发日志
  19. 数据结构:字符串 C++
  20. python生成简单名片二维码(不带图片)

热门文章

  1. c++中 int, long long, double 等数据类型的长度及范围整理
  2. RS485集线器知识详解
  3. 光端机安装调试需注意的几大因素
  4. 【渝粤教育】国家开放大学2018年秋季 2006T经济数学基础12 参考试题
  5. 【渝粤教育】国家开放大学2018年秋季 0630-21T环境法学 参考试题
  6. 【渝粤教育】国家开放大学2018年春季 0675-21T中级财务会计(2) 参考试题
  7. 【渝粤教育】电大中专药事管理与法规 (2)作业 题库
  8. 【渝粤题库】广东开放大学 信息安全数学基础 形成性考核 (2)
  9. 【渝粤题库】国家开放大学2021春2503学前儿童健康教育题目
  10. 【渝粤题库】国家开放大学2021春1334纳税筹划题目