在Python中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作——这就是命名空间。它就好像一个盒子,每一个变量都对应装着一个对象。当查询变量的时候,会从该盒子里面寻找相应的对象。
由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是session。典型的场景比如购物车,当你点击下单按钮时,由于HTTP是无状态协议,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建特定的session,用于标识这个用户,并且跟踪用户。这个session是保存在服务端的有且仅有一个唯一标识。在服务端保存session的方法很多,内存、数据库、文件都有。
每次HTTP请求的时候,客户端都会发送相应的cookie信息到服务端。实际上大多数的应用都是用cookie来实现session跟踪的,第一次创建session的时候,服务端会在HTTP协议中告诉客户端,需要在cookie里面记录一个session ID,以后每次请求会把这个ID发送到服务器,服务端就直到你是谁了。
Session:是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie:是客户端保存用户的一种机制,用来记录用户的一些信息,也是session实现的一种方式。
new:创建对象时调用,会返回当前对象的一个实例
init:创建完对象后调用,对当前对象的一些实例化,无返回值
调用顺序:先调用new生成一个实例在调用init方法对实例进行初始化,比如添加属性。
如果实际参数的数据类型是可变对象(列表、字典),则函数参数的传递法昂是将采用引用传递的方式。如果是不可变的,比如字符串、数值、元组,他们就是按值传递。
保存当前运行状态(断点),然后暂停执行,即将函数挂起。
将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用,当使用next()、send()函数让函数从断点处继续执行,即唤醒函数。
自动处理分配回收内存的问题,没有了内存泄漏的隐患,以引用计数机制为主,标记-清除和分代收集两种机制为辅。
计数机制就是 Python 中的每⼀个对象都有⼀个引⽤计数的值,当有引⽤的时候,这个值会增加,引⽤他的对象被删除时,这个值减⼩,引⽤计数的值为0时,该对象⽣命结束,Python 会把这段内存⾃动回收。(缺点,循环引⽤,如果 l1 和 l2 相互引⽤,没⽤其他的对象引⽤他们,这两段内存永远⽆法被回收)引用计数:python内部使用引用计数,来保持追踪内存中的对象,python内部记录了对象有多个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不需要时,这个对象的引用计数为0时,它被垃圾回收。
垃圾回收:python会检查引用计数为0的对象,清除在其内存占用的空间;循环引用对象则用一个循环垃圾回收期来回收。
内存池机制:在python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快有被释放;由于这些内存的申请不是为了创建对象,所以并没有对象一级的内存池机制。这就意味着python在运行期间会大量地执行malloc和free地操作,频繁地在用户态和核心态之间进行切换,这将严重影响python的执行效率。为了加速python的执行效率,python引入了一个内存池机制,用于管理对小块内存的申请和释放。
python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
python中所有小于256字节的对象都是用pymalloc实现的分配器,而大的对象则使用系统的malloc。另外python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些数的内存就不能在分配给浮点数。
深拷贝:新建一个对象,把原来对象的内存完全复制过来,改变复制后的对象,不会改动原来内存的内容(两个对象在复制之后是完全独立的对象)
等号赋值:相当于为原来的对象打上一个新的标签,两个引用指向同一个对象,修改其中的一个,另一个也会产生变化。
浅拷贝:
两种情况,1. 浅拷⻉的值是不可变对象(数值、字符、元组)时,和等于赋值⼀样,对象的id值和浅拷⻉原来的值相同;2. 如果是可变对象(列表、字典等),a. ⼀个简单的没有嵌套的对象,复制前后的对象相互之间不会影响,b. 对象中有复杂⼦对象,如列表嵌套,如果改变原来的对象中复杂⼦对象的值,浅拷⻉的值也会受影响,因为在浅拷⻉时只复制了⼦对象的引⽤(只拷⻉⽗对象)。1.解释型,语法简单易懂,可读性强;
2.有很多库可以用,可以让我们站在巨人的肩膀上简单的实现想要的功能;
2.可扩展,和其他编程语言或其他软件有可连接的接口;
4.免费开源、可移植;
5.自动内存管理,让程序员可以专注于代码的实现
缺点:
1.它的可解释性特征使得其运行速度变慢。
2.动态语言的特点可能会增加运行时的错误。
面向对象是把构成问题的事务分解成各个对象,建立对象来描述某个事务在解决问题的步骤中的行为;面向过程是分析出解决问题所需要的步骤,然后用一些函数把这些步骤一步步实现,使用的时候一次调用函数就行。