在分析python的参数传递是如何进行的之前,我们需要先来了解一下,python变量和赋值的基本原理,这样有助于我们更好的理解参数传递。

python变量以及赋值

  • 数值

从几行代码开始

In [1]: a = 1

In [2]: b = a

In [3]: a = a + 1

我们先将1赋值给a,也就是a指向了1这个对象,在python中一切皆对象。接着b=a,则表示让b也指向了1这个对象,python中一个对象是可以被多个引用所指向。最后执行的a=a+1,这里需要注意一点,python的数据类型中如int、str等不可变类型,执a=a+1这种操作,并不是把a指向的对象的值增加1,而是生成一个新的对象2,并让a指向2这个对象,原来的对象还存在于内存中。那这里的话还是会被指向,我们来分别看一下a和b的值:

In [4]: a
Out[4]: 2 In [5]: b
Out[5]: 1

通过这个例子你可以看到,这里的 a 和 b,开始只是两个指向同一个对象的变量而已,或者你也可以把它们想象成同一个对象的两个名字。简单的赋值 b = a,并不表示重新创建了新对象,只是让同一个对象被多个变量指向或引用。同时,指向同一个对象,也并不意味着两个变量就被绑定到了一起。如果你给其中一个变量重新赋值,并不会影响其他变量的值。

  • 列表

还有一个列表的例子,再来瞅瞅:

In [6]: l1 = [3,4,5,6]

In [7]: l2 = l1

In [10]: l1.append(7)

In [11]: l1
Out[11]: [3, 4, 5, 6, 7] In [12]: l2
Out[12]: [3, 4, 5, 6, 7]

代码中,我们让l1和l2这两个变量都指向了[3,4,5,6]这个对象,我们知道列表是一种可变的数据结构,所以append操作并不会产生新的对象,只是在末尾添加了一个元素,变成了[3, 4, 5, 6, 7],由于 l1 和 l2 同时指向这个列表,所以列表的变化会同时反映在 l1 和 l2 这两个变量上,那么,l1 和 l2 的值就同时变为了[3, 4, 5, 6, 7]。

  • 对象删除

python中变量是可以删除的,但是对象是没办法删除的

In [22]: a = [1,4,5]

In [23]: del a

del语句删除a这个变量,就无法通过a访问[1,4,5],但是这个对象在存在中还是存在的,python的垃圾回收机制发现引用为0的时候就会把它回收掉。

  • 总结

    • 变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;而一个对象,可以被多个变量所指向
    • 可变对象(列表,字典,集合等等)的改变,会影响所有指向该对象的变量
    • 对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象
    • 变量可以被删除,但是对象无法被删除

python函数是如何进行参数传递的

python的参数传递是赋值传递或者说是引用传递,python里一切皆对象,所以参数传递时,只是让新变量与原变量指向了同一个对象,下面我们来看个例子:

In [28]: def func(b):
...: b = 2 In [29]: a = 1 In [30]: func(a) In [31]: a
Out[31]: 1

这里的参数传递,使变量 a 和 b 同时指向了 1 这个对象。但当我们执行到 b = 2 时,系统会重新创建一个值为 2 的新对象,并让 b 指向它;而 a 仍然指向 1 这个对象。所以,a 的值不变,仍然为 1。

如何改变a的值呢?

我们可以在函数中将b返回

def func(b):
b = 2
return b
a = 1
a = func(a)
a
2

上面的例子我们的是int类型的,下面我们看一下列表的例子:

def func(l2):
l2.append(77) l1 = [12,3,6]
func(l1)
l1
[12,3,6,77]

这里 l1 和 l2 先是同时指向值为[1, 2, 3]的列表。不过,由于列表可变,执行 append() 函数,对其末尾加入新元素 4 时,变量 l1 和 l2 的值也都随之改变了.

那大家看一下面的例子,结果是什么呢?

def func(l2):
l2 = l2 + [4] l1 = [12,3,6]
func(l1)
l1
[12,3,6]

可以看到,l1没有发生变化,原因是l2 + [4]这个操作表示创建了一个末尾加入元素 4的新列表,并让 l2 指向这个新的对象,l1还是指向原有的对象。

总结

今天,我们讨论了 Python 的变量及其赋值的基本原理,并且解释了 Python 中参数是如何传递的。和其他语言不同的是,Python 中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者是叫对象的引用传递。需要注意的是,这里的赋值或对象的引用传递,不是指向一个具体的内存地址,而是指向一个具体的对象。

本文链接:https://immortalp.com/articles/2020/05/11/1589204241941.html

欢迎大家去 我的博客 瞅瞅,里面有更多关于测试实战的内容哦!!

python是如何进行参数传递的?的更多相关文章

  1. Python中函数的参数传递与可变长参数

    转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...

  2. Python 函数定义以及参数传递

    Python 函数定义以及参数传递1.函数定义#形如def func(args...): doSomething123以关键字def 开头,后面是函数名和参数下面是函数处理过程. 举例: def ad ...

  3. python中的*和**参数传递机制

    python的参数传递机制具有值传递(int.float等值数据类型)和引用传递(以字典.列表等非值对象数据类型为代表)两种基本机制以及方便的关键字传递特性(直接使用函数的形参名指定实参的传递目标,如 ...

  4. Python引用复制,参数传递,弱引用与垃圾回收

    引用 先上个示例: >>> val = [1] >>> val[0] = val >>> val [[...]] 上述代码使val中包含自身,而产 ...

  5. Python的特有的参数传递(*和**)

    目录 值传递 引用传递 python的传递方式具有两种值传递和引用传递.除此之外,python中还允许包裹方式的参数传递,这未不确定参数个数和参数类型的函数调用提供了基础: 值传递 int.float ...

  6. 【Python学习】函数参数传递方法四种(位置,关键字,默认值,包裹位置,包裹关键字传递)

    1. 位置传递: #--coding:utf-8-- def send(name,address): return 'package is sent to %s, located in %s' %(n ...

  7. Python强大的可变参数传递机制

    今天模拟定义map函数.写着写着就发现Python可变长度参数的机制真是灵活而强大. 假设有一个元组t,包含n个成员: t=(arg1,...,argn) 而一个函数f恰好能接受n个参数: f(arg ...

  8. python装饰器的参数传递

    被装饰器装饰的函数名即使没有被调用(因为有@xxx,会触发运行装饰器),(装饰器工厂函数)定义装饰器的代码已经运行了(最内部的那个函数并没有运行)(把被装饰的原函数引用赋值给了装饰器内部的那个函数名) ...

  9. python的函数调用和参数传递

    不可变对象(immutable):int.string.float.number.tuple 可变对象(mutable):dict.list 对于基本数据类型的变量,变量传递给函数后,函数会在内存中复 ...

随机推荐

  1. 今天整理了几个在使用python进行数据分析的常用小技巧、命令。

    提高Python数据分析速度的八个小技巧 01 使用Pandas Profiling预览数据 这个神器我们在之前的文章中就详细讲过,使用Pandas Profiling可以在进行数据分析之前对数据进行 ...

  2. Shell脚本日志关键字监控+告警

    最近小张的爬虫程序越来越多,可当爬虫程序报错,不能及时的发现,从而造成某些重要信息不能及时获取的问题,更有甚者,遭到领导的批评.于是就在想有没有一种方法,当爬取信息报错的时候,可以通过邮件或者短信的方 ...

  3. 并发工具——CyclicBarrier

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 CyclicBarrier简介 CyclicBarrie ...

  4. Epicor RoHS Overview

    Epicor ERP具有一个旨在帮助符合指令2002/95/EC (RoHS1) and 2011/65/EU (RoHS2)的模块,特别适用于医疗设备公司. 不合格的依据是–最大浓度值和合格声明/ ...

  5. Windows DC域控由server08r2升级至server2016测试

    测试环境 原DC: csctest.com CSCDC01 192.168.100.1 server08r2 CSCDC02 192.168.100.2 server08r2 要求: 原两台旧主机均更 ...

  6. vue如何添加jquery?

    1.首选通过npm安装jquery? 2.在build/webpack.base.conf文件当中引入jquery <pre>module.exports = { ... resolve: ...

  7. redis:String字符串类型(三)

    字符串拼接(如果key不存在则创建):append name " applesnt" 获取字符串的长度:strlen name 127.0.0.1:6379> set nam ...

  8. Web前端开发必不可少的9个开源框架

    大多数人想到Web开发时,通常会想到HTML或JavaScript,往往忽略了CSS,根据Wikipedia的说法,CSS既是网页中最重要也是最常被遗忘的部分之一,尽管它是万维网的三大基础技术之一. ...

  9. MySql --FIND_IN_SET() 函数 (转)

    例子:https://www.jianshu.com/p/b2c1ba0ba34f 举个例子来说:有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11 ...

  10. OpenWrt-19.07.2 For HC5861(极路由3) /HiWiFi/Gee最新固件,极路由3刷openwrt

    OpenWrt For HiWiFi(HC5861) 自编译精减固件,极路由3自用固件 HC5861-uboot.bin v19.07.2 下载 支持 NTFS 读写 支持 Wi-Fi 5G 驱动 默 ...