精华内容
下载资源
问答
  • Python 变量的缓存机制.pdf
  • Python变量名解析机制

    2019-08-11 20:55:44
    Python变量名解析机制 问题描述:   前一段时间在编写python程序定义函数的时候偶尔忘记给函数传入相应参数,结果发现在函数中使用函数外的全局变量竟然不报错而且运行通过了。虽然感觉很奇怪但并没有对这个问题...

    Python变量名解析机制

    问题描述:

      前一段时间在编写python程序定义函数的时候偶尔忘记给函数传入相应参数,结果发现在函数中使用函数外的全局变量竟然不报错而且运行通过了。虽然感觉很奇怪但并没有对这个问题进行解决,今天在阅读《Python学习手册》时找到了这个问题的答案。
      先给出一个简单的例子来说明我之前的困惑:

    a = 2
    def printa():
        print(a)
    printa()
    

      这个程序按照c等语言的语法来说是会报错的,因为我们没有在printa这个函数内定义变量a,但是在python中程序给出了正确的运行结果‘2’。明明在函数中没有定义a这个变量也没有将a作为参数传入,python为什么实现了对a的输出?

    问题解决:

      在《Python学习手册》的第418页的 “ 变量名解析:LEGB原则 ” 这一章中给出了答案。
      LEGB法则:当在函数中使用未确定的变量名时,Python 搜索 4 个作用域:本地作用域(Loacl),之后是上一层嵌套结构中 def 或 lambda 的本地作用域(Enclosing function locals),之后是全局作用域(Global),最后是内置作用域(Build-in)。按这个查找原则,在第一处找到的地方停止。如果没有找到,Python 会报错。也就是说python会从本地变量开始自下向上一层一层的查找所用到的变量。
      这样我们的问题就很好解释了,当程序运行到print(a)时,python会先在函数内部的本地作用域查找变量a,未找到然后层层向上查找,在全局作用域中找到了这个全局变量a然后完成了对它的输出。
      这里还有一点需要注意:当在函数中给一个变量名赋值时,Python会创建或改变本地作用域的变量,而不会对全局的变量进行赋值操作(除非在这个函数中使用global的方式声明该变量为全局变量)。

    展开全文
  • Python变量的内存机制

    2019-04-18 15:06:49
    Python 对象池、字符串itern机制、垃圾回收1. 小整数和字符串对象池1.1 小整数1.2 大整数1.3 字符串1.4 pycharm中的现象2. 垃圾回收 GC 垃圾回收Garbage collection2.1 Python对象分配隔代回收2.2 GC 模块 1. 小整数...

    1. 小整数和字符串对象池

    1.1 小整数

    在这里插入图片描述

    1.2 大整数

    不再上述范围内的大整数 都需要重新创建(超过256的id就变了)
    在这里插入图片描述

    1.3 字符串

    默认开启itern机制
    在shell中示例,并非全部的字符串都会采用intern机制。仅仅包括下划线、数字、字母的字符串才会被 intern,当然不能超过20个字符。因为如果超过20个字符的话,解释器认为这个字符串不常用,不用放入字符串池中
    is 相等代表两个对象的 id 相同(从底层来看的话,可以看作引用同一块内存区域)
    在这里插入图片描述
    python字符串的intern机制:

    字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?即值同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。
      
      简单原理:
      实现 Intern 机制的方式非常简单,就是通过维护一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在于池子中就不再去创建新的字符串,直接返回之前创建好的字符串对象,如果之前还没有加入到该池子中,则先构造一个字符串对象,并把这个对象加入到池子中去,方便下一次获取。

    但是,解释器内部对intern 机制的使用策略是有考究的,有些场景会自动使用intern ,有些地方需要通过手动方式才能启动

    1.4 pycharm中的现象

    但是在Pycharm中 整数超过256字符串即使带有空格也都认为地址一样,20个字符以内

    str1  = 'asfd*a10 asd'
    str2 = 'asfd*a10 asd'
    print(id(str1),id(str2))
    print(str1 == str2)
    a = 257
    b = 257
    print(id(a),id(b))
    

    结果如下所示:
    在这里插入图片描述

    2. 垃圾回收 GC 垃圾回收Garbage collection

    在这里插入图片描述
    引用计数为主。隔代回收为辅
    在这里插入图片描述
    一个字节占8位 int 2**32长度
    在这里插入图片描述
    在这里插入图片描述
    缺点维护统计 消耗资源
    解决不了循环引用

    在这里插入图片描述

    2.1 Python对象分配

    Ruby与python的区别
    ruby会一直申请使用内存空间 ,直到可用的被用完,才开始清理内存
    python当一个内存没有被使用时 立刻被清除

    隔代回收

    1. 循环引用
      在这里插入图片描述在这里插入图片描述
      在这里插入图片描述

    2. 检测循环引用
      0代链表 即没有被引用的。如图所示 除了ABC,DEF还有三个其他的对象存在于零代链表,蓝色的箭头指示有一些对象
      正在被零代链表之外的其他对象引用。所以他们有更高的引用计数。
      当链表到达一定程度时就会检测 循环引用 如果有的话就会减一

    2.2 GC 模块

    1. 操作函数
      在这里插入图片描述
      在这里插入图片描述
    2. 触发回收机制,避免程序崩溃
    3. GC 手动回收
      gc.collect() (gc.garbage()保存着已经清除的垃圾对象)
    4. 程序自己关闭
    5. 开启自动回收机制
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    展开全文
  • Python内存回收的基石是引用计数,“当一个对象的引用被创建或复制时,对象的引用计数加1;当一个对象的引用被销毁时,对象的引用计数减1”,如果对象的引用计数减少为0,将对象的所占用的内存释放。...

    Python内存回收的基石是引用计数,“当一个对象的引用被创建或复制时,对象的引用计数加1;当一个对象的引用被销毁时,对象的引用计数减1”,如果对象的引用计数减少为0,将对象的所占用的内存释放

    展开全文
  • python变量与内存

    2020-12-20 23:27:47
    探讨python变量与内存python语言的引用引用、id与赋值python的垃圾处理机制不可变对象和可变对象不可变对象可变对象赋值、浅拷贝与深拷贝在函数中的使用 首先声明本文所有测试结果由vs2019 community版,python3.8...
  • python变量存储机制

    2019-10-02 21:28:57
    1、python变量其实是一种堆内存的引用,可以理解为一个实体的标签,而在不同变量之间的拷贝复制(如a=b),他们所表示的对象实体是同一个。 2、-5到256之间的整数的内存地址是固定的(闭区间),并不会因为被赋值给一个...

    1、python的变量其实是一种堆内存的引用,可以理解为一个实体的标签,而在不同变量之间的拷贝复制(如a=b),他们所表示的对象实体是同一个。
    2、-5到256之间的整数的内存地址是固定的(闭区间),并不会因为被赋值给一个变量而开辟新的内存区域来储存这些常用整数值,对这些整数进行缓存以节省多次分配销毁的开销,除了这之外的其他的数是会开辟新的存储空间。

    展开全文
  • Python变量类型及储存Python变量类型Python变量类型表示Python变量类型demoPython变量使用Python变量使用demo多个变量同时引用同一对象不同变量引用小于256的对象不同变量引用大于256的对象 Python变量类型 1.与...
  • Python变量内存管理

    2020-03-02 18:15:30
    文章目录Python变量内存管理一、变量存哪了?二、Python垃圾回收机制2.1 引用计数三、小整数池 Python变量内存管理 一、变量存哪了? Copyx = 10 当我们在p1.py中定义一个变量x = 10,那么计算机把这个变量值10存放...
  • python 变量-内存模型

    2021-07-24 20:25:12
    python 变量-内存模型 python的变量其实是一种堆内存的引用,可以理解为一个实体的标签,而在不同变量之间的拷贝复制(如a=b),他们所表示的对象实体是同一个 python却使用了另一种完全...python变量的内存机制 ...
  • python变量、变量属性

    2019-10-06 03:08:28
    1.简述执行Python程序的两种方式以及他们的优缺点 答:交互型优点:马上...答:当删除变量名或者给变量名重新定义时,pythom的垃圾回收机制会自动将变量值清除 3.对于下述代码: x = 10 y = 10 z = 10 del y 10的引...
  • Python 变量传递

    2018-04-26 10:48:32
    Python中默认传递引用: 如果函数收到可变对象(列表,字典)的引用,则会修改原来的值; 如果函数收到不可变对象(数字,字符串, 元组)的引用,则不会修改原来的值。 那么对于类呢? 说明类的实例变量...
  • Python变量与数据类型简介 *********本文介绍python基本的变量的声明,层级,机制,命名规则以及python主要的数据类型 1.python变量 设置变量的目的:如果需要反复使用或者改变某一值得时候,可将该值设置为变量,...
  • Python变量引用浅析

    千次阅读 2019-04-09 11:02:30
    对于刚接触Python语言的同学来说,可能不太了解Python中参数赋值的机制:在Python中,对一个变量的赋值,实际上是修改了数据的引用。 本文将在下面举几个例子来帮助说明该机制 首先我们来证明一下,对于变量的赋值...
  • 在之前学习python设计模式(工厂模式实践篇),希望使用全局变量代替c++的宏完成服务自动注册功能时,遇到过一个问题,全局变量的定义和使用放在同一个可执行脚本中的问题
  • python变量是一切皆对象,所有变量都是引用类型,变量名在栈区中,实际值在堆区中。 java变量基本数据类型(整形、浮点型、字符型、布尔型)的变量名和值在栈区中,其他引用类型(字符串、数组、对象等)和python...
  • 变量的类型通过第一次赋值来实现定义,实际上变量名是一个指针,指向内存中的值,当变量改变时,直接改变指针,同时回收之前指向的内存(实际上小整数和字符串具有缓存机制,这种情况下小整数和字符串占用的区域会被...
  • python 变量和参数

    千次阅读 2018-12-24 17:34:38
    对于变量和参数, x=3中x是变量,它不是参数,但是在函数y=3x+4中,x是变量,也是参数。下面这一段来自微软网站的比较高度抽象,而且意义涵盖深远。 参数和变量之间的差异 (Visual Basic) 多数情况下,过程必须...
  • Python变量的理解与内存管理

    千次阅读 2018-08-28 00:55:49
    Python变量 变量 变量的存储  变量在C语言中  全局变量:其存放在内存的静态变量区中  局部变量:代码块中未调用时以字符串的形式存放在内存的代码区当中,当被调用后存放在内存栈区    Python的变量...
  • Python变量和对象

    千次阅读 2015-09-26 17:33:40
    一、Python变量 Python中若要使用变量,不需要提前声明,也不需要指定类型,只需要在用的时候,给变量赋值即可。 Python中一切都是对象,赋值的作用就是让变量指针指向某个对象,也就是说变量中存放的对象的引用,而...
  • python变量和常量

    2018-09-20 16:59:26
    python变量类型不固定 所以python又称为动态语言,与之对应的是静态语言。例如Java是静态语言。 静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。 #java int a = 0; a = "...
  • Python变量及常量解释说明

    千次阅读 2019-03-11 11:14:34
    文章目录变量变量在内存中的表示常量 变量 (1)在计算机程序中,变量不仅可以是数字,还可以是任意数据类型, 变量子啊程序中就是一个变量名表示的,变量名必须是大...(2)在python中,等号"="是赋值语句,可以把...
  •   我们知道,python的变量是有类型的,对于python变量的几种类型,我们在写python时是必须要有一定的概念的。知道类型就要知道变量类型怎么存储,可是为什么python的变量不需要声明类型就可以直接赋值?变量如果有...
  • Python变量-下划线,私有变量

    千次阅读 2014-10-16 10:46:25
     Python 用下划线作为变量前缀和后缀指定特殊变量。 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量
  • Python变量的三个特征

    2020-08-21 15:28:02
    对于每个变量python都提供了这三个方法分别获取变量的三个特征,其中python的内置功能id(),内存地址不一样,则id()后打印的结果不一样,因为每一个变量值都有其内存地址,而id是用来反映变量值在内存中的位置,...
  • 本文给大家Python中的变量以及简单的数据类型。首先给大家介绍Python的运行机制。 一、运行Python文件机制   其实Python在运行文件的时候和java是差不多的,我们学java的时候,学过JVM机制的。因此,我们在运行...
  • Python变量的认识理解(修订版)

    热门讨论 2021-05-13 22:05:43
    Python变量的认识理解: 变量(variable)是编程的基础概念,Python 的变量看似简单,深入了解却不易。 在大多数语言中,为一个值起一个名字时,把这种行为称为“给变量赋值”或“把值存储在变量中”。不过,...
  • Python变量命名规则

    千次阅读 2018-05-29 22:38:33
    变量名中不能出现空格,中间可由大写字母区分,也可由下划线分隔eg:studentNumber 或者student_number4. 不能以特殊字符作为变量名,可由字母和数字组合,但不能以数字开头eg:4name="Stronger" 错误eg...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,605
精华内容 45,842
关键字:

python的变量机制

python 订阅