python面试题(一)

Python是如何进行内存管理的?

从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制

  • Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数

引用计数增加的情况

1.一个对象分配一个新名称
2.将其放入一个容器中(如列表、元组或字典)

引用计数减少的情况

1.使用del语句对对象别名显示的销毁
2.引用超出作用域或被重新赋值

sys.getrefcount()函数可以获得对象的当前引用计数。对于不可变数据(如数字或字符串),解释器会在程序的不同部分共享内存,节约内存。

  • 垃圾回收
    1.当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
    2.当两个对象a和b互相引用时,del语句可以减少a、b的引用计数,并销毁用于底层对象的名称。然而,由于每个对象都包含一个对其他对象的引用,因此引用计数不会归零,对象也不会销毁。从而导致内存泄露。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除他们。
  • 内存池机制
    Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
    1.Pymalloc机制:为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
    2.Python对所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
    3.对于Python对象,如整数,浮点数和List,都有独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

什么是lambda函数?

lambda表达式,通常是在需要一个函数,但是不想费神去命名一个函数的场合下使用,也就是指匿名函数。
lambda [arguments]:expression

写出一段代码实现删除一个list里面的重复元素

1.使用set函数。set(list)
2.使用字典函数。
a=[1,2,3,2,3,2,4,5,3,6] b={} b=b.fromkeys(a) c=list(b.keys()) c

用sort进行排序,从最后一个元素开始判段

```
    a=[1,2,4,23,4,5,64,13,4,67,8]
    a.sort()
    last=a[-1]
    for i in range(len(a)-2,-1,-1):
        if last==a[i]:
            del a[i]
        else:
            last=a[i]
    print(a)
```

Python里面如何拷贝一个对象?(赋值、浅拷贝和深拷贝的区别)

赋值(=):创建了对象的一个新引用,修改其中任何一个变量都会影响到另一个
浅拷贝:创建一个新对象,但它包含的是对原始对象中包含项的引用,如果用引用的方式修改其中一个,另一个也会改变。(完全切片方法、工厂函数list()、copy模块的copy()函数)
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象,修改其中一个,另一个不会改变。(copy模块的deep.deepcopy()函数)

下面代码会输出什么?

```
    def f(x,l=[]):
        for in range(x):
        l.append(i*i)
        print l
    
    f(2)
    f(3,[3,2,1])
    f(3)
```
```
    [0,1]
    [3,2,1,0,1,4]
    [0,1,0,1,4]
```

这两个参数是什么意思:*args,**kwargs

如果我们不确定要往函数中传入多少个参数,或者我们想向函数中以列表和元组的形式传参数时,那就要用*args.
如果我们不知道要往函数中传入多少个关键字参数,或者传入字典的值作为关键字参数时,那就要使用**kwargs

单例模式

1.使用new方法

    class Singleton(object):
        def __new__(cls,*args,**kw):
            if not hasattr(cls,'_instance'):
                orig=super(Singleton,cls)
                cls._instance=orig.__new__(cls,*args,**kw)
            return cls._instance
    class MyClass(Singleton):
        a=1

2.共享属性
创建实例时把所有实例的dict指向同一个字典,这样他们具有相同的属性和方法。

    class Borg(object):
        _state={}
        def __new__(cls,*args,**kw):
            ob=super(Borg,cls).__new__(cls,*args,**kw)
            ob.__dict__=cls._state
            return ob
    class MyClass(Borg):
        a=1

3.装饰器

    def singleton(cls,*args,**kw):
        instances = {}
        def getinstance():
            if cls not in instances:
                instances[cls]=cls(*args,**kw)
            return instances[cls]
    
    @singleton
    class MyClass:
        ...

4.import方法
作为Python的模块是天然的单例模式

你可能感兴趣的:(python面试题(一))