在网上看python的基础知识,看到函数这一章的时候,看到这么一段话:

所有参数(自变量)在Python里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。

def changeme( mylist ):

"修改传入的列表"

mylist.append([1,2,3,4]);

print "函数内取值: ", mylist

return

list1 = [10,20,30];

changeme( list1 );

print "函数外取值: ",list1

运行结果:

函数内取值: [10, 20, 30, [1, 2, 3, 4]]

函数外取值: [10, 20, 30, [1, 2, 3, 4]]

[Finished in 0.2s]

感觉好像真的是引用传递,于是乎自己写了点代码验证:

def changeA(a):

a = 10

num = 2

changeA(num)

print num

打印出的结果却是 “2”。。。。蒙圈了!。。。说好的引用传递呢。

网上搜索了一番,发现很多人是这么说的:

不可变类型引用传递,可变类型值传递。

原来是这样,但啥是可变类型,不可变类型,又在网上搜索了一下:

在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象

这样好像可以解释上面的代码了,但是个人觉得传对象引用(对象传递)更好理解

在python中,变量就是一个变量,没有类型可言,我们可以给一个变量赋各种类型的值

a=2

a="test"

a=[2,3,3]

而类型是属于对象,一个类型具体的值在内存中都一个地址,改变变量的值其实是改变了它引用的地址

print id(1)

print id(2)

a=1

print id(a)

a=2

c=2

print id(a)

print id(c)

运行结果:

23044824

23044812

23044824

23044812

23044812

[Finished in 0.1s]

上面代码可以看出,整型1,2在内存中有自己的地址,把他们赋值给变量的时候,就是把自己的地址引用给了变量。

现在来解释上面的代码:

列表[10,20,30]是一个对象,有自己的内存地址,比如是:123456,变量list1用这个地址指向了这个列表。调用函数changeme的时候,这个列表对象的地址传给了mylist,此时list1和mylist都指向了同一个列表

。mylist调用append方法,因为列表是可变类型(个人理解为可以改变值,但地址不变),地址123456的列表变为[10, 20, 30, [1, 2, 3, 4]],  所以list1的值也是[10, 20, 30, [1, 2, 3, 4]]。

第二段代码,num=2, 2也是一个对象,假如2在内存的地址是:54321,此时变量num的地址是:54321。调用函数changeA,此时变量a的地址也是54321,此时a=2,接着a=10,因为数字类型是不可变类型,2不能直接变为10,10在内存中是另外一个地址,比如54330。上面说过改变变量的值其实是改变引用的地址,因此当a=10执行完后,变量a的地址是54300,而num的地址依然是54321,其值也就是2

再附上个链接参考一下:

python 值传递还是引用传递_python函数是值传递还是引用传递相关推荐

  1. python中return返回值为函数名_Python函数返回值

    Python函数返回值教程 同时,Python 函数的返回值不需要在函数的签名上体现,只需要在函数体里面直接使用 return 语句返回即可. Python函数不返回值详解 语法 def func_n ...

  2. 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)

    2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...

  3. python函数调用时的实参和形参之间传递_python 函数(实参与形参、传递参数)...

    函数 什么是函数?函数是带名字的代码块,用于完成具体的工作.写出一个函数后,就可以一直调用. 定义函数,函数的基本组成: 1.1 向函数传递参数 向函数中传递任意参数,这样打印出的结果就可以根据自己的 ...

  4. python采用函数式编程模式吗_Python函数与函数式编程

    1 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创 ...

  5. python缺省参数与多个函数返回值

    缺省参数 调用函数时,缺省参数的值如果没有传入,则被认为是默认值. 下例会打印默认的age,如果age没有被传入. def printinfo( name,age = 35 ): # 打印任何传入的字 ...

  6. 在python子程序中、使用关键字_python函数(四)

    一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...

  7. pythonget返回值_python 函数返回值

    Python 函数返回值 一.函数返回值 返回值作用: 一旦函数调用或执行,那么函数外部的程序,就没办法控制函数的执行过程.此时外部程序只能等待函数执行结果 为什么要等待? 因为外部程序要根据函数的执 ...

  8. python二重积分0到正无穷_python函数的数值二重积分

    我有点困在一个函数上,我试图通过scipy,python进行数值积分.在 为了简单起见,我将函数定义为:integral f(x,y)= SUM[double integral(ax+by)dxdy] ...

  9. python不定长参数怎么相加_python函数不定长参数使用方法解析

    这篇文章主要介绍了python函数不定长参数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 pathon中的函数可以使用不定长参数,可以 ...

最新文章

  1. 所有编程皆为Web编程
  2. gpio_direction_output 与 gpio_set_value
  3. java中所有的类都继承于_Java中所有的类都是通过直接或间接地继承()类得到的...
  4. Nacos,阿里开源,是真的香!!
  5. 信息学奥赛C++语言:小青蛙回来了
  6. 力扣883.三维体投影面积
  7. Centos7.9源码编译安装Apache
  8. 哨兵系列卫星介绍与下载教程
  9. matlab临界转速教学,转子动力学求解转子临界转速与固有频率详解.ppt
  10. 罗永浩、戴威的C位消亡史
  11. 5G网络架构及其对承载网的影响
  12. MySQL open_tables和opened_tables
  13. 关于鼠标手的症状和恢复方法
  14. java joda time_使用Joda-Time优雅的处理日期时间
  15. 贝塞尔曲线最小二乘法拟合(随意切向/切向方向统一)------路适用于绝大多数的最小二乘法拟合
  16. win7通过win10的ISO镜像免费升级正版win10(组图)
  17. Servlet重定向和转发
  18. IP地址192.168.48.10,掩码为255 255.255.128,其所在的子网为(),广播地址为),有效的主机IP地址范围从()到().
  19. 怎样恢复被删除的文件
  20. vue 点击打开小窗口

热门文章

  1. 一文解析激光雷达中时序融合的研究现状和发展方向
  2. 听说你好不容易写了个爬虫,结果没抓几个就被封了?
  3. 深度学习入门之PyTorch学习笔记:深度学习介绍
  4. c++读取txt文件中的数字_在Python中读取包中的数据文件的三种方式
  5. 【Linux病毒】腾讯云 cron、sshd 进程CPU占用超95%(亡命徒 Outlaw 僵尸网络攻击)问题排查及处理步骤
  6. nginx php7 fastcgi,Windows下搭建PHP7+FastCGI+Nginx环境
  7. Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway.
  8. username is marked non-null but is null
  9. Tomcat 8.5——配置阿里云免费SSL证书(PFX格式证书)[启用HTTPS协议]
  10. Superhero Transformation