• 13
  • 13
分享
  • Python参数作用域解析——软件测试圈
  • TIMI 2022-02-25 13:23:24 字数 1769 阅读 1595 收藏 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次数,提高效率。


文章来源:百度文库

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1、引言在日常工作中,我们总是需要操作linux进行日志的查看,以确定报错原因。并且,作为查看日志的方式,我在面试的过程中,也会经常问求职者;但是,绝大部分的求职者就知道 cat 命令, 技术稍微好一点的可能会了解 实时查看的 tail命令。其他的方式,就很少了解了。今天,我就整理一下,关于linux的实时查询的就是方式。2、tail2.1 单文件查询tail 最常用的 :#实时查询info.log文件200条信息 tail  -f 200 info.log如果文件更新频次很快,无法及时捕捉信息, 可以与grep组合使用#查询info.log文件中&nb...
            1 0 1427
            分享
          •        这周我总共面试了三个软件测试的实习岗位,好累(累并快乐着)。不过总算没白费这个月的努力和准备,三个都过了(并不是我很牛哈,因为是实习岗位,要求没那么高。)对自己的表现还算满意吧(5.8分(满分10分)别问为什么是5.8,哈哈哈)起码问题基本上能回答出来,虽然回答并没有全对,但总能答对几点。过后回想,自己对于知识的掌握,回答问题的技巧相比一个多月前的我,是有很大的进步,但还是很逊色,还需要加油鸭~       不过这里面的问题在我此次的三次面试都没有被问到。。。      ...
            1 1 2421
            分享
          •   简介  除了测试,测试数据创建、需求跟踪和测试报告等任务也可自动化。  随着迭代,可自动化的内容越来越多:  什么应该被自动化?  与人工测试相比,具备明显收益  ·如果失败会对业务造成相当大的损失的业务功能或用户流;自动化测试有助于经常验证这些功能。  · 需要针对应用程序的每个构建或发布版本运行的测试,如烟雾测试、正常性测试和回归测试。  · 需要针对多种配置运行的测试,如不同平台和浏览器的组合。  · 涉及大量测试数据集或输入大量数据的测试,例如填写很长的表格,因为测试自动化有助于实现扩大覆盖范围,减少工作量和提高可靠性。  · 报告,自动化测试报告减少了人工干预,并产生频繁和最新的...
            0 0 871
            分享
          • 今日晚间,达达、顺丰同城、闪送相继宣布与抖音生活服务达成合作,为餐饮商家提供同城配送解决方案。在抖音北京本地页面,提供外卖到家业务的商家已经开始提供商家自配业务。据一位火锅品牌商家向新消费日报透露,商家随机选择配送平台的功能,实际上已经试运行一段时间。“达达、顺丰同城、闪送都是全城配送,所以基本可以覆盖主城区所有地点,只是配送费用不同。”此前,抖音曾与饿了么达成合作,“饿了么外卖”出现在抖音小程序,不到4个月时间,抖音在即时配送领域再添新合作商,抖音在本地生活的野心尽显。团购服务商张霖对新消费日报记者表示,抖音选择在这一节点深耕本地生活,是因为价格敏感的用户比例在增加。“虽然总需求萎缩,但线上...
            0 0 692
            分享
          •   功能测试对于测试人员来说并不陌生,功能测试执行的大体流程是根据需求说明书设计测试用例,测试执行,测试总结。同样性能测试的执行过程也是如此。然而,功能测试与性能测试的区别在于,功能测试是单用户,性能测试是多用户,是从1到N的量变。由于无法通过手工操作模拟多用户并发,因此需要借助工具来实现用户操作被测系统某场景的动作流程,也就是编写测试脚本。那么,如何开展性能测试呢?  1、需求分析  通常开发人员会提供接口文档以及非功能需求文档。标准的接口文档中描述了接口请求地址,请求方式,参数类型以及请求报文和响应报文示例。如果接口文档中描述内容不是很清楚,测试人员可以通过抓包工具比如Fiddler,Ch...
            13 13 1644
            分享
      • 51testing软件测试圈微信