14 | 答疑(一):列表和元组的内部实现是怎样的?

 

目录

 

1.列表和元组的内部实现

2.为什么在旧哈希表中,元素会越来越稀疏。

3.有关异常的困扰

4.关于多态和全局变量的修改


1.列表和元组的内部实现

答:它和list相似,本质也是一个array,但是空间大小固定,不同于一般array,python的tuple做了许多优化,来提高在程序中的效率。如,当tuple的大小不超过20时,python就会把它缓存在内部的一个free list中,这样,如果你以后需要去创建现样的tuple,python就可以直接从缓存中载入,提高程序运行效率。

2.为什么在旧哈希表中,元素会越来越稀疏。

答:在例子中对比,可以看到新哈希表中的空间利用率,相比于旧哈希有大的提升。

3.有关异常的困扰

e = 1
try:
    1 / 0
except ZeroDivisionError as e:
    try:
        pass
    finally:
        del e

e开始指向整数1,但是except block结束时被删除(dele),所以会的“NameErroe”,所以在写代码时,一定要保证except中异常赋予的变量,在之后有语句中不再被用到。

4.关于多态和全局变量的修改

(1)python自己判断的多态和子类继承的多态Polymorphism是否相同

答:多态是指多种不同的形态,因此,判断类型是多态还是子类继承的多态,在本质上是一样的,只不过可以把它们理解为两tkhi同的表现形式。

(2)函数内部不能直接用+=修改全局变量,但对于list全局变量,却可以使用append、extend之类修改?

答:全局变量指向对象不可变是,比如整型、字符串,如果尝试在函数内部改变它的值,却不加关键字global,就会抛出异常。

x = 1

def func():
    x += 1
func()
x

## 输出
UnboundLocalError: local variable 'x' referenced before assignment

这是因为程序默认函数内部的x是局部变量,而你没有为其赋值就直接引用,显然不可行,不过,如果全局变量指向的对象是可变的,比如列表、字典等,就可以在函数内部修改。

x = 1

def func():
    x += 1
func()
x

## 输出
UnboundLocalError: local variable 'x' referenced before assignment

注意的是,x.append(2),并没有改变变量x,x依然指向原来的列表。这句的意思是,访问x指向的列表,并在这个列表的末尾加2.

猜你喜欢

转载自blog.csdn.net/yanyiting666/article/details/92800548
14