Python语言面试问题集锦(实时更新ing)

1: python中小整数对象池

      Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,无论这个整数处于LEGB中的哪个位置,所有位于这个范围内的整数使用的都是同一个对象。同理,单个字母也是这样的。                                                    

Python语言面试问题集锦(实时更新ing)

        上图解释: 变量num1和变量num2的地址是相同的, 是因为它们指的都是小整数对象池中的3,  但是后面将它们都赋值为300的时候,会发现地址不一样了,是因为300不在小整数池中,相当于两个对象.  即使小整数是在列表中, 它们的地址也是相同的, 还有就是单个字母,它们的地址也是相同的.

2: 元祖那些事

    不可变(immutable)对象类型: int, float, decimal, complex, bool, str, tuple, range, frozenset. bytes
    可变(mutable)对象类型: list, dict, set. bytearray

 元祖中是可以放可变类型的,如放入两个列表,列表中的元素可以随意添加更改.

3: endswith()的用法

     endswith() 方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数"start"与"end"为检索字符串的开始与结束位置。

Python语言面试问题集锦(实时更新ing)

      上图解释: 定义了字符串a,  直接不指定可选参数start和end的话, 默认是字符串结尾,  例子一就是说a字符串是否以'you'串结尾, 例子二指定了start=0, end=3 相当于就是将原始字符串0-3的字符单独看, 不算3. 看是否有'ow'结尾.

4: __main__的一些问题

Python语言面试问题集锦(实时更新ing)

Python语言面试问题集锦(实时更新ing)

      用第二个函数去调用第一个函数, 注意: 如果单独执行第一个函数, 也就是print_fun.py, '__name__ value:' 为 __main__,  如果通过调用, 即执行print_module.py '__name__ value:' 为print_fun.  也不会去执行main()函数

5: python中,集合是怎样保证去重的?

     答: python中集合的元素必须是唯一的(即hashable类型). 因此必须是不可变类型, 不可变类型: tuple, constant  可变类型: list dict set.   同理 字典的key也不能为不可变类型.

        集合去重主要是对地址的比对, 同一个数的ids是一样的.  当一个值要加入集合时, 如果该值在集合中, 那这个值对应的地址, 集合也知道. 因此无法加入.

6: Python语言怎么处理内存溢出的情况, 怎么设计内存回收?

     答:   内存泄露: 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。导致程序运行速度减慢甚至系统崩溃等严重后果。有 del() 函数的对象间的循环引用是导致内存泄漏的主凶。不使用一个对象时使用:del object 来删除一个对象的引用计数就可以有效防止内存泄漏问题。通过 Python 扩展模块 gc 来查看不能回收的对象的详细信息。可以通过 sys.getrefcount(obj) 来获取对象的引用计数,并根据返回值是否为 0 来判断是否内存泄漏

           内存溢出:  内存溢出: 你申请了10个字节的内存,但写入了大于10个字节的数据

           内存溢出原因:

           1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
           2.集合类中有对对象的引用,使用完后未清空,产生了堆积,使得JVM不能回收;
           3.代码中存在死循环或循环产生过多重复的对象实体;
           4.使用的第三方软件中的BUG;
           5.启动参数内存值设定的过小
           内存溢出的解决方案:
           第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)

           第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。

           第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。