1.__init__和__new__的区别
a.__new__是一个静态方法,而__init__是一个实例方法.b.__new__方法会返回一个创建的实例,而__init__什么都不返回,在类中如果两种方法同时存在,会优先调用__new__方法.
c.只有在__new__返回一个cls的实例后,__init__才会被调用.
d.当创建一个新实例时调用__new__,初始化一个实例时用__init__.
2.Python里的拷贝
import copy a = [1, 2, 3, 4, ['a', 'b']] b = a c = copy.copy(a) d = copy.deepcopy(a) a.append(5) a[4].append('c') print 'a = ', a print 'b = ', b print 'c = ', c print 'd = ', d 输出结果: a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] b = [1, 2, 3, 4, ['a', 'b', 'c'], 5] c = [1, 2, 3, 4, ['a', 'b', 'c']] d = [1, 2, 3, 4, ['a', 'b']]
b=a是引用传递,c=copy.copy(a)是浅拷贝,只拷贝父对象,并不会拷贝父对象内部的子对象,也就是说c并没有拷贝a内部的['a', 'b'],而是引用而已,所以 下面改变子对象时,a也随之改变。d的话就是深拷贝了,即拷贝了父对象,也拷贝了子对象,所以互不干扰。
还有这种
a = [1, 2, 3, 4, ['a', 'b']]
b = a[:]
属于'切片克隆',也是浅拷贝的一种。
3.*args and **kwargs
Python可变参数的标准写法。
>>> def func(*args, **kwargs):
print(args, kwargs)
>>> func(1, 2, 3, a=1, b=2)
(1, 2, 3) {'a': 1, 'b': 2}
>>> func(*[1,2,3], **{'a':1, 'b':2})
(1, 2, 3) {'a': 1, 'b': 2}
>>>
*args表示任意数量的位置参数都会合并成一个元组,并绑定到args上,而任意数量的关键字参数则会合并成一个字典,绑定到kwargs上。
如果原始参数是元组或列表或字典,则可以在调用函数时在实参前对应的加上'*'或'**'使得实参绑定到对应的形参上。
4.is 与 '=='
is是判断地址是否相同,'=='则是判断值是否相同。
5.闭包
闭包是Python函数式编程的重要语法结构。当一个内嵌函数引用外部作用域的变量,就会产生闭包。
def get_count(name):
count = [0]
def counter():
count[0] += 1
print('Hello,%s,%s access!'%(name, str(count[0])))
return counter
c = get_count('master')
c()
c()
c()
count 即闭包中的自由变量。
产生闭包的条件:
1.必须有一个内嵌函数
2.内嵌函数必须应用外部函数的变量
3.外部函数的返回值必须是内嵌函数
在计算机科学中,闭包(Closure)又称词法闭包(Lexical Closure) 或函数闭包,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即被打包在一起,即使离开了创造它环境也不例外。
函数运行后并不会被撤销。
闭包可以为函数定义环境创建一个小型的命名空间,方便编程。
6.Python垃圾回收机制