Python——变量的引用和函数的参数和返回值的传递方式
变量的引用
在python中,所有的变量都是指向地址,变量本身不保存数据,而是保存数据在内存中的地址。我们用下面的程序来理解:
a = 10
print(id(a))
a = 11
print(id(a))
(利用id( )方法查看数据的地址)
输出结果为:

可以发现:修改变量的值,变量保存的地址随之改变。
python中:
- 变量和数据是分开存储的
- 变量 中保存着数据在内存中的地址
我们把变量中记录数据的地址的行为,叫做 引用。
通俗的来说,在 Python 中,变量的名字类似于 便签纸 贴在 数据 上。
再看一段代码:
a = 10
print(id(a))
b = a
print(id(b))
c = 10
print(id(c))
d = 11
print(id(d))
结果如下:

从上面运行结果中,我们可以知道:
1.b=a是地址传递
2.声明一个变量时,如果内存中已经有变量要保存的内容了,会将该变量指向内存中原有内容的地址,如果内存中没有变量要保存的内容,就会在内存中开辟一块新的空间用来保存变量要保存的内容。
函数的参数和返回值的传递
我们通过一个程序来弄清楚函数的参数和返回值的传递方式是地址传递还是值传递。
def test(num):
print("-" * 40)
print("%d 在函数内的内存地址是 %x" % (num, id(num))) # 说明函数的参数传递时地址传递 result = 100 print("返回值 %d 在内存中的地址是 %x" % (result, id(result)))
print("-" * 40) return result a = 10
print("调用函数前,变量a引用的地址是 %x" % id(a)) r = test(a) print("调用函数时,实参内存地址是 %x" % id(a))
print("调用函数后,返回值内存地址是 %x" % id(r)) # 说明return返回值是地址传递
运行结果如下:

通过上面程序:
- 我们发现变量a以及将a传给函数的参数num的地址都是一致的,说明函数的参数传递是地址传递。
- 函数中result变量和接受返回值的r变量的地址是相同的,说明函数中的返回值传递也是地址传递
Python——变量的引用和函数的参数和返回值的传递方式的更多相关文章
- c&c++函数的参数和返回值的传递终结版
c++函数的参数和返回值的传递方式有三种:值传递.指针传递和引用传递. 在这之前先看几个例子: 一, int a=10; int b=a; b+=10; 此时b是a的一个拷贝,改变b的值,a并不会受到 ...
- javascript学习笔记(二):定义函数、调用函数、参数、返回值、局部和全局变量
定义函数.调用函数.参数.返回值 关键字function定义函数,格式如下: function 函数名(){ 函数体 } 调用函数.参数.返回值的规则和c语言规则类似. <!DOCTYPE ht ...
- python中函数的参数和返回值
目录 函数 目标 01. 函数参数和返回值的作用 1.1 无参数,无返回值 1.2 无参数,有返回值 1.3 有参数,无返回值 1.4 有参数,有返回值 02. 函数的返回值 进阶 示例 -- 温度和 ...
- python笔记六(函数的参数、返回值)
一 调用函数 在写函数之前,我们先尝试调用现有的函数 >>> abs(-9) 9 除此之外,还有我们之前使用的len()等.可以用于数据类型转换的 int() float() str ...
- 探寻main函数的“标准”写法,以及获取main函数的参数、返回值
main函数表示法 很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...
- python 复习 4-1 函数、参数、返回值、递归
函数 完成特定功能的一个语句组,这个语句组可以作为一个单位使用,并且给它组语句取一个名子,即函数名 可以通过函数名在程序不同地方多次执行,即函数调用 预定义函数(可以直接使用) 自定义函数(自编写的) ...
- 第10天:apply和call、bind、函数作为参数、返回值使用、闭包、递归的样例
apply和call apply和call都可以改变this的指向 函数的调用,改变this的指向 函数名字.apply(对象,[参数1,参数2,.....]) 方法名字.apply(对象,[参数1, ...
- JS中函数的本质,定义、调用,以及函数的参数和返回值
要用面向对象的方式去编程,而不要用面向过程的方式去编程 对象是各种类型的数据的集合,可以是数字.字符串.数组.函数.对象…… 对象中的内容以键值对方式进行存储 对象要赋值给一个变量 var cat={ ...
- JavaScript学习系列博客_17_JavaScript中的函数的参数、返回值
数的形参(形式参数) - 定义函数时,可以在()中定义一个或多个形参,形参之间使用英文逗号隔开:定义形参就相当于在函数内声明了对应的变量但是并不赋值,形参会在调用时才赋值. 函数的实参(实际参数) - ...
随机推荐
- DDD学习笔录——提炼问题域之知识提炼与协作的基本原则
1.通过通用语言达成共识 通用语言,已经强调过好多遍了,在DDD再怎么重视都不为过,后面可能还会讲. 知识提炼的输出以及共识的构建就是常见的通用语言(UL). 当与业务相关人员和主题专家进行建模时,每 ...
- new Com
CreateOleObject System.Win.ComObj.hpp #include <objbase.h> Winapi.ActiveX.pas CoInitiali ...
- jqurey datatable tableTools 自定义button元素 以及按钮定义事件
版本 1.10.4 "dom": 'T<"clear">lfrtip', "tableTools": { //"sSw ...
- Python基础学习三 字典、元组
一.元组 元组,提示别人,这个值是不能被改变的,元组的定义方式是用(),小括号: 元组只有两个方法,那就是count和index mysql1 = ('127.0.0.1',3306,'my','ro ...
- 如何解决quartz在集群下出现的资源抢夺现象
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度,简单的说就是可以 ...
- Linux主机名的设置
Linux主机名的设置 Linux主机名的设置步骤如下: 1.在/etc/sysconfig/network文件中修改HOSTNAME的值为要设置的主机名. HOSTNAME=myhost 2.在/e ...
- C#使用ADO操作Excel
1 说明 把excel当成一个数据库,类似于Access数据库来操作. 2 源代码 2.1 Model层 /// <summary> /// 人员信息 /// </summary&g ...
- java5 Condition用法--实现线程间的通信
Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Con ...
- EF中的批量操作
阅读目录 插入 更新 删除 在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么 ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...