• 13
  • 13
分享
  • Python参数作用域解析——软件测试圈
  • TIMI 2022-02-25 13:23:24 字数 1769 阅读 1673 收藏 13

1.核心机制

1.1.疑问:作用域有哪些?

图片1.png

全局作用域的范围仅限于单个文件。在python中格式没有一个基于单个的、无所不包的情景文件的全局作用域。

1.2.疑问:如何定义作用域?

Def/class/lambda三种方式

1.3.疑问:作用域的基本法则?LEGB法则

L:本地作用域;

E:上层结构中的本地作用域;

G:全局作用域;

B:内置作用域;

法则描述:

  1. 变量名引用分为四个作用域进行查找:LEGB,第一个能够完成查找的就算成功;

  2. 默认状态下,变量名赋值会创建或者改变本地变量;

  3. 全局声明将赋值变量名映射到模块文件内部的作用域;

需要讲的就这么多^_^

接下来,希望大家能自己慢慢去体会“引用”和“赋值”之间的区别,那将是对大脑的一种摧残。

2.扩展说明

以下内容中有很多问题跟python的内存管理机制和python语言自身的规则相关,目前还没有看到那么细的地步,所以会有不少解释不够清晰的,个人只能尽量保证正确吧,请各位抱着找茬的心态继续一起继续前行。

2.1.疑问:什么叫变量名引用?什么叫变量名赋值?

只能举例说明啦……

  • 变量名赋值:

a、a = 1

a = 2

全局域申明一个变量a=1后,函数内部再去赋值的时,会重新创建一个新的本地局部变量a=2。

b、b = {}

c、c = []

d、t = (1, 2, 3)

e、……

  • 变量名引用:

a、a = 1

b = a    #b为赋值,a为引用,产生的结果是b与a一样都指向对数字1的引用,此时b和a的id应该是一样的

b、b = {}

b[‘name’] = ‘chenweiguo’

b[‘email’] = ‘chenweiguo@baidu.com’

#此时b所指引的内存空间并没有发生变化,只是新增了两个元素数据;

c、c = [1, 2, 3, 4]

c[2] = 6

对于列表c来说,这只是一次引用,改变的是内部的链表中的一个元素

d、……

应用和赋值应该都只是针对与变量关系最接近的这一级元素来说的。

2.2.疑问:global申明变量命令空间,必须要用吗?

  • 全局变量是位于模块文件内部的顶层的变量名;

  • 全局变量如果是在函数内被赋值的话,必须经过申明;

  • 全局变量名在函数的内部不经过声明也可以被引用。

2.3.疑问:参数在函数间传递时,为何有些是可变,有些不可变?

  1. 函数参数传递时,传递的都是引用;

  2. 不可变参数的应用传递后,如果数据发生改变,则会创建新的对象,降低原参数的引用,对原有数据不会产生影响;

  3. 可变参数在函数中引用时,可以改变调用函数中的数据;但如果是赋值,则会创建新的对象,对原有数据同样不影响。

见《python学习手册》第347页

2.4.疑问:哪些是可变对象参数?哪些是不可变对象参数?

  • 可变对象参数:

dict(通过哈希+指针索引实现)、list(通过链表实现)

  • 不可变对象参数:

int(long长度的内存空间)、string(连续内存空间)、tuple(在python源码分析中未找到该对象的介绍)与可变对象/不可变对象对应的还有一个概念:变长对象、定长对象

2.5.疑问:如何让函数的参数不被改变?

  1. 通过不可变对象来进行传递;

  2. 在函数内部主动做一次赋值操作,如:a = a[:];

2.6.疑问:如何实现不可变参数在函数中的修正?

通过return返回,python的返回值没有个数限制。

2.7.疑问:id()不同的对象是否就意味着不同的对象?

>>> id.__doc__
"id(object) -> integer\n\nReturn the identity of an object.  This is guaranteed to be unique among\nsimultaneously existing objects.  (Hint: it's the object's memory address.)"

2.8.疑问:什么是小整数对象?

通过宏定义实现,默认值为[-5, 257),小整数对象是为了减少python程序运行中对这些整数的频繁使用(申请和析构)带来的效率低下问题。相似的还有常用字符缓冲池。

另外,python对于大整数及其他需要使用内存的对象一样,并不是不停的通过malloc和free实现的,还是单独封装了一层内存的管理机制,尽量减少实际物理内存的malloc和free次数,提高效率。


文章来源:百度文库

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   相信很多测试人员在进入职场时都面临过一个问题:大厂VS创业公司,到底该如何进行选择呢?  别着急,让我们先看看两者测试相关的区别。  大厂和创业公司,不管从测试流程、测试角色划分、测试用例设计还是使用的测试工具上,都是有比较明显的区别的。笔者在大厂和创业公司分别呆过三年,今天简单来总结下大厂和创业公司测试流程的区别。  大厂的测试流程  大厂的测试流程,每一步都有会议记录,需求变更严格走变更流程,会输出规格书、prd和原型图以及设计图。  创业公司的测试流程  创业公司的测试流程,一个会议会同时确认好几个事情,需求变更看大小,不麻烦就直接做上去了,基本只有原型图和设计图。  看完梳理的流程...
            0 0 931
            分享
          • 如何做前端单元测试对于现在的前端工程,一个标准完整的项目,通常情况单元测试是非常必要的。但很多时候我们只是完成了项目而忽略了项目测试。我认为其中一个很大的原因是很多人对单元测试认知不够,因此我写了这边文章,一方面期望通过这篇文章让你对单元测试有一个初步认识。另一个方面希望通过代码示例,让你掌握写单元测试实践能力。前端为什么需要单元测试?必要性:JavaScript 缺少类型检查,编译期间无法定位到错误,单元测试可以帮助你测试多种异常情况。正确性:测试可以验证代码的正确性,在上线前做到心里有底。自动化:通过 console 虽然可以打印出内部信息,但是这是一次性的事...
            8 9 1459
            分享
          •       许多测试工程师使用Postman进行API测试自动化。他们发现端点,发出请求,创建测试数据,运行回归测试,使用Newman等实现API测试的持续集成。但是,Postman有一定的测试限制。希望获得更多负载测试能力的开发人员,DevOps和QA工程师可以将其Postman测试转换为JMeter。这篇博客文章将解释何时建议将Postman转换为JMeter,并逐步说明如何实现。      PostmanAPITestingLimitations      可扩展性  ...
            6 6 2160
            分享
          •   以前写多接口场景用例的时候,基本上一个测试类里只包含我的接口用例要调用的方法,如果有需要调用其他方法都是写到通用里。本次我尝试把我的接口用例要调用的其他的解析的方法也写在我的测试类里,感觉看起来也挺舒服的。  关于接口自动化前面已经提到了很多很多,今天想记录这一篇是因为原本我可以敷衍地写完我的用例的,但是我还是认真思考了。感觉自己棒棒哒!  接口背景  · saveZnfy   保存婴幼儿照护费用  · queryZxfjkcZnfyXq查询婴幼儿照护费用详情  · deleteZnfy作废婴幼儿照护费用  看这三个接口,我想也知道我今天要写的场景是啥了吧?没...
            0 0 885
            分享
          •   一、Kafka介绍  Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于 zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志, 消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。  主要应用场景是:日志收集系统和消息系统。  Kafka主要设计目标如下:  ·以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访 问性能。  · 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输...
            0 0 543
            分享
      • 51testing软件测试圈微信