python面试题

仅供参考

init和new的区别

在 Python 中,__init__()__new__() 是两个特殊的方法,它们都是在创建对象时调用的,但是它们有着不同的功能。

__new__() 方法在创建对象时被调用,它返回一个新的对象实例,它是类的静态方法,第一个参数是表示类的引用,其他参数与 __init__() 方法相同。通常情况下,您不需要直接调用 __new__() 方法,而是通过调用类的构造函数来创建新的对象。但是,如果您想要自定义对象创建的过程,那么可以重载 __new__() 方法。

__init__() 方法在对象创建后被调用,用于对对象进行初始化。它不返回任何值,只是对新创建的对象进行初始化。该方法可以接受任何数量的参数,但是第一个参数必须是 self,表示对象本身。通常情况下,您可以在 __init__() 方法中设置对象的初始状态,比如给属性赋值。

因此,__new__()__init__() 方法的区别在于,__new__() 方法是用于创建新的对象实例,而 __init__() 方法是用于初始化对象的。在创建对象时,Python 会先调用 __new__() 方法来创建对象,然后再调用 __init__() 方法来对对象进行初始化。

深拷贝和浅拷贝区别

在 Python 中,拷贝(Copy)指的是创建一个对象的副本,副本与原始对象有相同的值,但是它们是两个独立的对象。Python 中有两种类型的拷贝:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。

浅拷贝会创建一个新的对象,但是它会将原始对象的引用复制到新对象中,这意味着新对象和原始对象共享同一块内存。如果原始对象中的某个值发生变化,那么新对象中对应的值也会随之改变。在 Python 中,可以使用切片操作符 [:] 或者 copy() 方法来进行浅拷贝。

深拷贝会创建一个新的对象,并且它会递归地将原始对象中的所有子对象都进行拷贝。这意味着新对象和原始对象是完全独立的,它们不共享任何内存。在 Python 中,可以使用 copy.deepcopy() 方法来进行深拷贝。

总结一下,浅拷贝和深拷贝的区别在于是否递归地进行拷贝,以及是否共享内存。通常情况下,如果您需要修改拷贝后的对象,那么应该使用深拷贝,否则使用浅拷贝即可。

哈希表是什么

哈希表(Hash Table)是一种数据结构,它提供了快速的插入、查找和删除操作。哈希表由一个数组和一个哈希函数组成,它使用哈希函数将键映射到数组中的位置,然后将值存储在该位置中。当需要查找一个键时,哈希表使用相同的哈希函数来计算键的位置,并查找该位置中存储的值。

哈希表的关键思想是将键映射到数组中的位置。在哈希表中,键的值经过哈希函数处理后,得到一个在数组中的索引位置,这个索引位置就是该键值在哈希表中的存储位置。由于哈希函数是一种高效的算法,所以哈希表的插入、查找和删除操作都非常快速。

但是,哈希表也有一些限制。一是可能会存在哈希冲突,即不同的键值经过哈希函数处理后得到的位置相同,这时候需要使用冲突解决方法来处理;二是哈希表的内存消耗较大,因为哈希表需要预留足够的空间来存储数据,以便在发生哈希冲突时能够进行处理。

在 Python 中,字典(dict)就是基于哈希表实现的。Python 的字典是一种无序的键值对集合,其中的键必须是可哈希的,即不能是可变的对象。字典提供了快速的插入、查找和删除操作,因为它们是基于哈希表实现的。

哈希冲突是什么

哈希冲突是指不同的键通过哈希函数计算得到的哈希值相同,从而导致它们在哈希表中产生了冲突,需要采取相应的解决方法。哈希冲突是不可避免的,因为哈希函数的输出范围通常比键的数量小得多,所以不同的键会被映射到同一个哈希值上。

哈希冲突会影响哈希表的性能,因为它会导致哈希表中的元素无法被正确地访问。解决哈希冲突的方法通常有两种:

  1. 开放地址法:当发生冲突时,尝试在哈希表中寻找下一个空的位置来存储元素。这个过程可以通过线性探测、二次探测等方式实现。
  2. 链地址法:将哈希表的每个位置都设置为一个链表,当多个元素哈希到同一个位置时,它们可以添加到该位置对应的链表中。这样就不会出现元素覆盖的问题。

在 Python 中,字典(dict)是基于哈希表实现的,所以它采用了类似于链地址法的方法来解决哈希冲突。当多个键映射到同一个哈希值时,它们会被添加到一个链表中,然后在链表中查找对应的键值对。这种方法可以保证字典的插入、查找和删除操作都是高效的。

如何解决哈希冲突

哈希冲突可以采用以下两种方法进行解决:

  1. 开放地址法:当哈希函数将不同的键映射到同一个哈希值时,使用开放地址法来解决哈希冲突。开放地址法就是在哈希表中寻找下一个可用的空位置来存储冲突的键值对。这个过程可以通过线性探测、二次探测、双重哈希等方式实现。例如,在线性探测中,如果哈希函数将一个键映射到了已经被占用的位置,那么就顺序地往后查找,直到找到一个空位置来存储这个键值对。
  2. 链地址法:另一种解决哈希冲突的方法是使用链地址法。在链地址法中,每个哈希值对应一个链表,所有映射到该哈希值的键值对都存储在这个链表中。当哈希函数将一个键映射到某个哈希值时,可以通过遍历该哈希值对应的链表来查找对应的键值对。

在 Python 中,字典(dict)是基于哈希表实现的,因此采用了类似于链地址法的方法来解决哈希冲突。当多个键映射到同一个哈希值时,它们会被添加到该哈希值对应的链表中,然后在链表中查找对应的键值对。这种方法可以保证字典的插入、查找和删除操作都是高效的。

posted @ 2023-05-04 02:29  __username  阅读(11)  评论(0编辑  收藏  举报

本文作者:DIVMonster

本文链接:https://www.cnblogs.com/guangzan/p/12886111.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。