当前位置: 首页 > 编程日记 > 正文

append函数_连载|想用Python做自动化测试?函数的参数传递机制及变量作用域

 这一节有点难。看不懂没关系。继续往后学,回头再来看。

9bf8070fdf4208e3dc9b324b9ef79dc7.png

10.6 函数参数传递的机制

10.6.1 值传递与引用传递

编程语言的参数传递机制通常有两种:

  • 值传递

    • 拷贝参数的值,然后传递给函数里的新变量。这样,原变量和新变量之间互相独立,互不影响。

  • 引用传递

    • 把参数的引用传给新的变量,这样,原变量和新变量就会指向同一块内存地址。如果改变了其中任何一个变量的值,那么另外一个变量也会相应地随之改变。

10.6.2 Python 参数传递是赋值传递

这里首先引用 Python 官方文档中的一段说明:

“Remember that arguments are passed by assignment in Python. Since assignment just creates references to objects, there’s no alias between an argument name in the caller and callee, and so no call-by-reference per Se.”

准确地说,Python 的参数传递是赋值传递 (pass by assignment),或者叫作对象的引用传递(pass by object reference)。Python 里所有的数据类型都是对象,所以参数传递时,只是让新变量与原变量指向相同的对象而已,并不存在值传递或是引用传递一说。不要与引用传递弄混了,引用传递的是一个地址。

  • 不可变对象作为参数

def my_func1(b):  b = 2  #③函数执行时,变量b指向对象2a = 1  # ①实参变量a指向对象1my_func1(a)  #②因为是赋值传递,变量 b 也指向了变量a指向的对象 1 a  # ④函数执行完成后,变量a依然指向对象11

代码中注释里面的序号是程序的执行顺序。函数被调用时(②),因为是赋值传递,所以函数形参变量b指向了 实参变量 a  所指向的对象1。但当代码执行到 b = 2 时(③),系统会重新创建一个值为 2 的新对象,并让 b 指向它;而 a 仍然指向 1 这个对象。所以,a 的值不变,仍然为 1。

稍作改变,让函数返回新变量,赋给 a,再来看看。

def my_func2(b):  b = 2  #③函数执行时,变量b指向对象2  return b  # ④关键,函数返回一个指向对象2的变量a = 1 # ①实参变量a指向对象1a = my_func2(a)  # ②将my_func返回值(指向对象2)赋值给了a,所以a 也指向了对象2a2
  • 可变对象作为参数

当可变对象当作参数传入函数里的时候,改变可变对象的值,就会影响所有指向它的变量。

def my_func3(l2):    l2.append(4)  # ③在原对象[1,2,3]上修改,对象变为 [1,2,3,4]l1 = [1, 2, 3] # ① l1是个可变对象,指向了对象[1,2,3]my_func3(l1) #②因为是赋值传递,变量 l2 也指向了变量l1指向的对象 [1,2,3]l1  # ④函数执行完成后,l1和l2指向的对象发生了改变[1, 2, 3, 4]

如果多次调用my_func3,那么每次l1得到的结果都不一样,l1不断在列表后面添加元素4。

def my_func3(l2):    l2.append(4)  # ③在原对象[1,2,3]上修改,对象变为 [1,2,3,4]if __name__ == '__main__':    l1 = [1, 2, 3] # ① l1是个可变对象,指向了对象[1,2,3]    my_func3(l1) #②因为是赋值传递,变量 l2 也指向了变量l1指向的对象 [1,2,3,4]    print(l1)    my_func3(l1)  # ②因为是赋值传递,变量 l2 也指向了变量l1指向的对象 [1,2,3,4,4]    print(l1)    my_func3(l1)  # ②因为是赋值传递,变量 l2 也指向了变量l1指向的对象 [1,2,3,4,4,4]    print(l1)

不改变原来可变对象的值,而是生成新对象,结果与上面不同。看下下面的:

def my_func4(l2):    l2 = l2 + [4]  # 创建了一个“末尾加入元素 4“的新对象,原对象没变l1 = [1, 2, 3]my_func4(l1)l1[1, 2, 3]  # l1对象没变

实际工程中,我们一般不希望函数内部可以修改外部变量的值,因为可能会导致代码出现异常而且难以排查问题所在。所以通常函数内部重新创建一个新的列表(可变对象),对这个新列表(可变对象)进行操作,而不是操作输入的列表,并增加语句return 语句。再来看一个类似的例子:

def multiply_2_pure(l):    new_list = []  # 创建一个新列表    for item in l:        new_list.append(item * 2)    return new_list  # 返回新列表

10.7 函数变量作用域

10.7.1 局部变量

定义在函数内部,它的作用域是在函数内部,函数调用结束之后,函数里面保存的信息就被销毁了。比如下面的这个代码示例,连续调用函数4次,每次输出的值都是4,即3+1,这说明每次调用fun函数之后,函数内部定义的局部变量num就被销毁了,再次被调用时将被重新初始化为1,那如果要保存函数的局部变量,怎么办呢?后面介绍的“闭包”就可以完成这个任务。

def fun(step):    num = 1    num += step    print(num)i = 1while i < 5:    fun(3)    i += 1

10.7.2 全局变量

定义在整个文件层次上,如下MIN_VALUE和MAX_VALUE这两个变量就是全局变量,通常大写。

MIN_VALUE = 1MAX_VALUE = 10def validation_check(value):    if value < MIN_VALUE or value > MAX_VALUE:        raise Exception('validation check fails')

不能在函数内部随意改变全局变量的值,一定要改变的话,要在全局变量前面加个global。global的作用就是在“函数局部作用域”内声明表示一个全局变量,从而可以在函数内部修改全局变量的值(否则只能访问不能修改)。

MIN_VALUE = 1MAX_VALUE = 10def validation_check(value):    global MIN_VALUE  # 表示函数内部的这个MIN_VALUE是来自全局变量MIN_VALUE    MIN_VALUE += 1  print(MIN_VALUE) validation_check(5)  # 输出2

10.7.3 局部变量覆盖全局变量

如果遇到函数内部局部变量和全局变量同名的情况,那么在函数内部,局部变量会覆盖全局变量。

MIN_VALUE = 1MAX_VALUE = 10def validation_check(value):    MIN_VALUE = 3    print(MIN_VALUE) # 输出3validation_check(5)

10.8 函数的嵌套

函数可以嵌套定义。

  • 形式1,在函数内部直接调用定义的内部函数

def outer(name):    num = 100    def inner(weight, height, age):        weight += 1        height += 1        age += 1        print(name, weight, height, age)    inner(100, 200, 300)  # 直接调用“内部函数”outer('盒子')
  • 形式2,在函数内部return定义的内部函数

def outer(name):    num = 100    def inner(weight, height, age):        weight += 1        height += 1        age += 1        print(name, weight, height, age)    return inner  # 返回函数对象alias = outer('盒子')  # 调用外部函数,得到inner对象alias(100, 200, 300)  # 调用inner函数对象,传入三个参数
  • 闭包,外部函数执行完后,外部函数的参数仍然会被内部函数记住。

def nth_power(exponent):  # 外部函数    def exponent_of(base):        return base ** exponent  # 内部函数使用了外部函数的参数    return exponent_of  # 外部函数返回内部函数exponent_ofsquare = nth_power(2)  # exponent_of赋值给变量square,square记住了外部函数的exponent参数值2cube = nth_power(3)  # exponent_of赋值给变量cube,记住了外部函数的exponent参数值3print(square(9))  # 计算9的平方print(cube(9))  # 计算9的立方

nth_power(2)被调用时,exponent被赋值为2,并且保存到exponent_of函数对象中。当square(9)被调用时,其实就是调用exponent_of函数,这个函数内部base是9,exponent是2,因此square(9)的返回值是81。

通过Pycharm的Debug功能来看一下:

b448b129806419916cf70c92f5db7ee1.png

从这里可以看出,代码执行到print(square(9))这一行时,nth_power(2)已经执行结束了,但是它的局部变量exponent的信息却被保存了下来,从调试窗口可以看到它的值是2,从而当进入内部函数exponent_of时,就能够计算9**2了,这就是“闭包”的最大的作用——保存局部信息不被销毁。

函数特点总结:

  • 函数也是对象

  • 函数对象可以赋值给变量

  • 函数对象可以作为参数传递给另外的函数

  • 函数对象可以作为另外一个函数的返回值

  • 函数可以嵌套定义

1103da05ce40a66ca81bd0d190b39a92.gif

相关文章:

PowerDesigner生成数据库

此文中图片不小心被删除了&#xff0c;特重写了PowerDesigner生成数据库修改 一、 用POWERDESIGNER生成数据库 FILE&#xff0d;》NEW 在MODEL NAME中输入模版名 在DBMS中选择要连接的数据库类型 点击确定 确定后出现如下页面 选中工具条面版上的 表按钮 在…

随想_8_Windows_XP_Explorer_错误

最近发现微软的系统的稳定性&#xff0c;还是有待提高啊&#xff0c;这不XP SP3的资源管理器&#xff0c;就犯毛病了&#xff0c;俗话说有图 有真相&#xff0c;各位请看&#xff1a; 大家看&#xff0c;资源管理器左边的导航栏&#xff0c; 就可以发现&#xff0c;里面很多东西…

webpack笔记(6)调试模式

在配置devtool时&#xff0c;webpack给我们提供了四种选项。 source-map:在一个单独文件中产生一个完整且功能完全的文件。这个文件具有最好的source map,但是它会减慢打包速度&#xff1b;cheap-module-source-map:在一个单独的文件中产生一个不带列映射的map&#xff0c;不带…

nicstat命令安装与分析

nicstat安装包下载与安装&#xff1a; wget https://downloads.sourceforge.net/project/nicstat/nicstat-1.95.tar.gz tar -zxvf nicstat-1.95.tar.gz cd nicstat-1.95 cp Makefile.Linux Makefile vi Makefile 后修改 CFLAGS $(COPT) make && make install //…

component是什么接口_【Android每日一题】从Activity创建到View呈现中间发生了什么?...

前言前段时间公司招人&#xff0c;作为面试官&#xff0c;我经常让面试者简述View的绘制流程。他们基本都能讲明白View的测量(measure)、布局(layout)、绘制(draw)等过程。还有少数人会提到DecorView和ViewRootImp的作用。但是&#xff0c;当我继续追问关于Window的内容时&…

wp 删除独立存储空间文件(多级非空文件夹删除)

void DelFile(string unZipFilePath)//unZipFilePath第一次传递的是根目录名 { using (var store IsolatedStorageFile.GetUserStoreForApplication()) { if (store.DirectoryExists(unZipFilePath)) { …

重拾博客小序与杂思

寒假期间&#xff0c;条件所限&#xff0c;不能上网&#xff0c;也不能更新博客。寒假结束&#xff0c;懈怠了两个星期&#xff0c;打算重拾博客&#xff0c;继续更新。这学期&#xff08;2012年2月到2012年8月&#xff09;在专业学习上将突出几个集中研究的领域&#xff0c;在…

Ubuntu iso镜像文件写入U盘

Ubuntu iso镜像文件写入U盘 Ubuntu iso镜像文件写入U盘方法 分步指南 命令行输入 usb-creator-gtk如下&#xff1a;3、Device 选择插入的U盘 4、image 选择镜像文件 5、make startup disk

页面布局让footer居页面底部_网站各页面该如何布局关键词优化提升排名?

在网站优化中&#xff0c;最值得关注的一个事情就是关键词的布局&#xff0c;因为关键词的布局直接影响着网站的排名。那么怎样布局关键词才能提高页面和关键词的相关性&#xff0c;并提高网站排名呢&#xff1f;下面一起来看看。一、利用HTML标签布局关键词众所周知&#xff0…

Linux中如何配置IP

与网络相关的文件&#xff1a;1) /etc/sysconfig/network 设置主机名称及能否启动Network2) /etc/sysconfig/network-scripts/ifcfg-eth0设置网卡参数的文件3) /etc/modprobe.conf 开机时用来设置加载内核模块的文件4) /etc/resolv.conf 设置DNS IP&#xff08;解析服务器&…

《DSP using MATLAB》Problem 5.7

代码&#xff1a; %% %% Output Info about this m-file fprintf(\n***********************************************************\n); fprintf( <DSP using MATLAB> Problem 5.7 \n\n);banner(); %% % -------------------------------------------…

一般将来时语法课教案_「英语语法」一般过去时用法技巧全解

大家好&#xff0c;我是教课蚪英语的张老师&#xff0c;今天我们来学习英语语法100讲的第一课&#xff0c;一般过去时&#xff01;一、首先我们了解一下什么是一般过去时&#xff1f;英语语法1. 概念&#xff1a;描述过去的状态或过去的动作。 在英语中&#xff0c;非现在的以前…

修改Ubuntu的启动logo

修改Ubuntu的启动logo 原文链接: https://my.oschina.net/jmjoy/blog/380262 内容: Plymouth splash screen is the initial splash screen at boot-up.Ubuntu 10.04 uses Plymouth instead of xsplash to manage the fancy boot graphics.If you want something different,y…

每周四十小时,你有多少是在为自己干活?

努力工作为什么&#xff1f;普通人不外乎希望加薪、升职&#xff0c;过的更好。 但是&#xff0c;要想达到这个目标&#xff0c;靠什么&#xff1f; 普通人当然要靠提升自己的能力和经验。 可是&#xff0c;你是不是已经发现&#xff0c;工作最踏实的&#xff0c;却未必取得最好…

在Linux下查看共享文件夹

一般情况&#xff0c;我们用到smbclient&#xff0c;常用方法所如下&#xff1a;#smbclient -L //IP地址或计算机名smbclient是samba的Linux客户端&#xff0c;在Linux机器上用来查看服务器上的共享资源&#xff0c;也可以向ftp一样&#xff0c;用户可以等里samba服务器&#x…

算法复杂度的定义

算法复杂度分为时间复杂度和空间复杂度。其作用&#xff1a; 时间复杂度是指执行算法所需要的计算工作量&#xff1b;而空间复杂度是指执行这个算法所需要的内存空间。&#xff08;算法的复杂性体现在运行该算法时的计算机所需资源的多少上&#xff0c;计算机资源最重要的是时间…

C#操作OFFICE一(EXCEL)

C#操作Excel! publicclassImportExportToExcel { private string strConn ; private System.Windows.Forms.OpenFileDialog openFileDlgnew System.Windows.Forms.OpenFileDialog(); private System.Windows.Forms.SaveFileDialog saveFileDlg…

c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

目录1.图的基本定义2.双边匹配问题2.1 二分图基本概念2.2 二分图最大匹配求解2.3 二分图最优匹配求解2.4 二分图最优匹配建模实例2.4.1 二分图最优匹配在师生匹配中的应用2.4.2 二分图最优匹配在多对多拼车算法中的应用3.网络最大流3.1 网络流基本定义3.2 最大流的问题线性规划…

linux 查看库的安装信息

ldconfig -p | grep 库名(例如&#xff1a;lib***&#xff09; 比如&#xff1a; ldconfig -p | grep libcrypto

Asp.net无刷新调用后台实体类数据并以Json格式返回

新建一般处理程序public class Temp {public int Index { get; set; }public string Description { get; set; }public string ImagePath { get; set; }public DateTime MyDate { get; set; } }//数据源 List<Temp> listTemp new List<Temp>(){new Temp(){ Index1…

HDU 排名(简单题)

好久没在oj上做题了&#xff0c;刚开始第二天做一道简单题的心得记录。 1 #include <cstdio>2 #include <cstring>3 #include <string>4 #include <iostream>5 #include <algorithm>6 using namespace std;7 8 /*9 超级无语的错误&#xff0c;#d…

linux系统操作常见问题(ubuntu和opensuse)

在玩linux的过程中&#xff0c;会遇到各种看似奇怪的问题&#xff0c;这些问题往往让那些刚刚接触linux没多久的人不知所措&#xff0c;心中烦躁&#xff0c;这里把我曾经遇到对各种问题列出来&#xff0c;供喜欢linux对人参考&#xff1a; linux下以root身份成功运行chromium…

java iso8583 socket 服务_JAVA客户端amp;服务器的socket通信

JAVA客户端&服务器的socket通信socket是两台主机之间的一个连接通道&#xff0c;它可以完成七个基本操作&#xff1a;发送远程机器发送数据接收数据关闭连接绑定端口监听入站数据再绑定端口上接收来自远程机器的连接在客户端上使用socket程序用构造函数创建一个新的sockets…

linux 扩容

如何在linux系统中增加一块硬盘&#xff0c;并且格式化它呢&#xff1a; 我是使用VMware-workstation-full-7.1.0-261024.exe来做实验的。&#xff08;1&#xff09;使用VMware-workstation 给虚拟机增加一块硬盘&#xff0c;如下图所示&#xff1a;&#xff08;2&#xff09;然…

Python3 xml模块的增删改查

xml数据示例 ?1234567891011121314151617181920212223242526<data><country name"Liechtenstein"><rank updated"yes">2</rank><year updated_by"Alex">2009</year><gdppc>141100</gdppc><…

mysql 函数返回表格_mysql 数据分析如何实现日报、周报、月报和年报?

推荐阅读&#xff1a;MySQL复习&#xff1a;20道常见面试题(含答案)21条MySQL性能调优经验秋招Java面试大纲&#xff1a;Java并发spring数据库RedisJVMNetty等以天为统计周期&#xff0c;是常见需求。周报、月报更是常见需求。长周期项目&#xff0c;甚至有年报需求。我已经掌握…

如何开启to 日志

命名 gc_date %Y-%m-%d %H:%M:%S.log&#xff0c;11月15号21:51:58开始生成gc日志 注&#xff1a;在哪个目录启动tomcat&#xff0c;就会在哪个目录生成gc日志文件 转载于:https://www.cnblogs.com/qqzy168/archive/2012/11/16/2772636.html

联想电脑 Realtek RTL8821CE 无线网卡 驱动安装 16.04/18.04

原文连接: https://askubuntu.com/questions/1071299/how-to-install-wi-fi-driver-for-realtek-rtl8821ce-on-ubuntu-18-04 内容&#xff1a; As far as I can tell, at the time of writing this, there is not yet a Wifi Driver for the Realtek RTL8821CE in the officia…

PXE网络无人职守安装

PXE网络无人职守安装DHCP、TFTP、NFS、APACHE为同一台服务器&#xff1a;192.168.0.1yum -y install dhcp xinetd tftp-server syslinux nfs-utils httpd system-config-kickstart一、配置DHCP1.默认的DHCP配置文件内容是空的&#xff0c;可以拷贝usr目录下的样板文件修改cp /u…

贪心算法之硬币问题

有1元&#xff0c;5元&#xff0c;10元&#xff0c;50元&#xff0c;100元&#xff0c;500元的硬币个C1&#xff0c;C2&#xff0c;C3&#xff0c;C4&#xff0c;C5&#xff0c;C6枚&#xff0c;用这些硬币来支付A元&#xff0c;最少需要多少枚硬币&#xff1f; #include<io…