面试题(十二)

1、可变对象与不可变的区别?

可变对象是指对象的内容是可变的,不可hash的,例如list,dict
当对象的内容发生变化时,变量的对象引用是不会发生变化的

不可变的对象则相反,表示内容不可变,可以被hash,例如字符串 int,string,float,tuple
Python中的变量存放是对象引用。对象不可变化,但变量可以重新赋值,那么对应的对象引用也发生变化
答案

2、集合set是一种什么样的数据结构?何时使用?
集合是无序排列的可hash的值,可做为字典的key,用于成员关系测试,和去除重复元素

3、python是如何进行内存管理的?
a.对象的引用机制
b.垃圾回收
c.内存池机制

4、python传递参数是值传递还是引用传递?为什么?

python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
答案

5、__new__ 和 __init__的区别?

__init__ 方法为初始化方法, __new__方法才是真正的构造方法。
__new__ 方法必须返回值,__init__方法不需要返回值
答案

6、copy()、deepcody()的联系与区别?

浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象。
深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联
虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。

浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。
而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。
答案

7、is 和 == 的区别?

Python中的对象包含三要素:id、type、value
其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值
is判断的是a对象是否就是b对象,是通过id来判断的
==判断的是a对象的值是否和b对象的值相等,是通过value来判断的
答案

8.cookie 和 session 的区别与联系?

cookie是存在客户端的,session是存在服务器端
cookie跟踪会话,也可以保存用户偏好设置或者保存用户名和密码等 ,session主要跟踪回话
cookie 是不安全的 session相反
答案



9、函数、类方法定义中如何实现可选参数,可选关键字参数

*agrs **kwargs
答案



10、解释with关键字的用法和机制

with 关键可用于文件打开关闭操作 机制:__enter__ 获取上下文对象会调用 __exit__()
答案

11、解释进程,线程,协程的区别与联系?

线程:是夏佐系统中能够进行运算调度的最小单元,他被包含在进程中,是进程实际运作的单位
进程:是在一次数据集上的一次动态执行过程,相当于一个应用程序,独占内存,必须有一个线程,又称主线程
协程:就是开一个进程和一个线程,当遇到阻塞的时候不用等,会自动切换
答案



12、线性地址,虚拟地址,逻辑地址,物理地址的区别与联系?

虚拟地址是由程序产生的由段选择符和段内偏移地址组成的地址。
逻辑地址指由程序产生的段内偏移地址
线性地址是指虚拟地址到物理地址变换的中间层, 是处理器可寻址的内存空间(称为线性地址空间)中的地址
物理地址是指现在 CPU 外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
答案



13、post 和 get 方法区别?

1. 根据HTTP规范,GET一般用于获取/查询资源信息,应该是安全的和幂等。而POST一般用于更新资源信息
2. get是在url中传递数据,数据放在请求头中。 post是在请求体中传递数据
3. get传送的数据量较小,只能在请求头上发送数据。post传送的数据量较大,一般被默认为不受限制。
4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
答案

单例模式:

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,"_instance"):
            cls._instance = super().__new__(cls,*args,**kwargs)
        return cls._instance


def singleton(cls,*args,**kwargs):
    instance = {}
    
    def _singleton():
        if cls not in instance:
            instance[cls] = cls(*args,**kwargs)
        return instance[cls]
    return _singleton
答案
原文地址:https://www.cnblogs.com/skiler/p/7007031.html