Python面试准备

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垃圾回收机制


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值