美文网首页Python
Python常见问题汇总

Python常见问题汇总

作者: 文婷_5250 | 来源:发表于2018-05-22 16:55 被阅读8次

    变量赋值

    <1>赋值操作符 =
    Python语言中,等号(=)是主要的赋值操作符。
    <2>增量赋值x += 1 (不支持x++)
    <3>多重赋值x = y = z = 1
    <4>多元赋值 x, y = 1, 2

    问0:如果x=1的话,那么x变量里面保存的就是数值1咯?
    答:不不不,x里面保存的是1的地址,相当于x的变量是贴到1这个地址上的。

    问1:为什么有变量,为什么要有变量赋值?
    答:我的想法是,如果数字1存储在 内存地址 0x7FFFFF0000 中,如果每次都要写 0x7FFFFF0000 岂不是很麻烦 ,那么就简单一点我们起个变量名叫x 岂不美哉。

    问2: 如何看待Python语言中,对象是通过引用传递的?
    答:这个问题和问题0是差不多的,Python赋值语句会把对象值存储在变量名或者数据结构的元素中,赋值语句总是建立对象的引用值,而不是复制对象,因此Python变量更像是指针,而不是数据存储区域。

    标识符

    <1> 合法的Python标识符
    第一个字符必须是字母或者下划线
    剩下的字符可以是字母和数字或下划线
    大小写敏感

    <2>关键字
    语言的标识符,保留字

    <3>内建
    不是保留字,但是不推荐使用

    <4>.专用下划线标识符
    _xxx 不用 "from module import *" 导入
    xxx 系统定义名字
    _xxx 类中的私有变量名

    问3:如何看待Python中单下划线和双下划线的区别?
    name:一种约定,Python内部的名字,用来与
    用户自定义的名字区分开,防止冲突
    _name:一种约定,用来指定变量私有
    __name:解释器用_classname__name来代替这个名字用以区别和其他类相同的命名

    想要更加详细的了解这两者的区别,请点击:Python中的下划线(译文)

    基本风格指南

    问:什么是PEP8?
    答:一种Python编码风格指导规范。

    内存管理

    •无需变量实现声明
    •无需变量指定类型
    •不用关心内存管理
    •变量名会被回收
    •del 语句能够直接释放资源

    <1>变量定义
    变量在第一次被赋值的时会自动声明
    <2>动态类型
    解释器会根据语法和右侧的操作数来决定对象的类型
    <3>内存分配
    交给Python
    <4>引用计数
    •增加引用计数
    x = 3
    y = x

    •减少引用计数
    x = 3
    y = x
    x = 4

    •del语句
    会删除对象的一个引用
    •垃圾收集
    垃圾收集器会寻找引用计数为0的对象。

    问4:Python的垃圾回收机制是一种怎样的体验?
    答:
    引用计数为主,标记-清除和分带为辅
    引用计数: 引用计数为0,内存释放。
    标记-清除 容器对象 引用循环 定时回收
    分代收集 划分三代

    想要知道Python垃圾回收机制的详细情况 请点击:深入分析 Python 的垃圾回收机制

    问5:如何评价引用计数?
    答:
    引用计数为0时,该对象生命就结束了。
    引用计数机制的优点:
    1、简单
    2、实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。
    引用计数机制的缺点:
    1、维护引用计数消耗资源
    2、循环引用
    举个例子
    1 list1 = []
    2 list2 = []
    3 list1.append(list2)
    4 list2.append(list1)

    list1与list2相互引用,如果不存在其他对象对它们的引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收,这将是致命的。
    对于如今的强大硬件,缺点1尚可接受,但是循环引用导致内存泄露,注定python还将引入新的回收机制。
    所以说就有了 标记-清除 和 分代收集

    标记-清除 主要是要清除哪种情况呢?
    答:“标记-清除”是为了解决循环引用的问题。
    就是上面那种情况.

    分代收集 主要是为了解决哪种情况呢?
    答: 将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。

    其它:
    Python性能优化20条建议

    相关文章

      网友评论

        本文标题:Python常见问题汇总

        本文链接:https://www.haomeiwen.com/subject/kkhkjftx.html