简述Python的字符串驻留机制?
含义:字符串驻留是一种在内存中仅保存一份相同且不可变字符串的方法(Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量),类似数据库的存储过程。
使用方法:1>系统维护interned字典,记录已被驻留的字符串对象。
2>当字符串对象a需要驻留时,先在interned检测是否存在,若存在则指向存在的字符串对象,a的引用计数减1;若不存在,则记录a到interned中。
什么时候会用到字符串驻留机制:1>字符串长度为0或1时,默认采用驻留机制。
2>字符串长度大于1时,且字符串中只包含大小写字母、数字、下划线时,采用驻留机制。
3>字符串只在编译时进行驻留,而非运行时(.pyc文件)。
4>用乘法得到的字符串,如果结果长度 <=20且字符串只包含数字、字母大小写、下划线,支持驻留。长度>20,不支持驻留。这样的设计目的是为了保护.pcy文件不会被错误代码搞的过大。
5>对于[-5,256]之间的整数数字,Python默认驻留。
6>Pyhton提供intern方法强制2个字符串指向同一个对象。
Python 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
import math for i in range(2, 1000): factors = [] #i 每次循环都清空 for j in range(1, math.floor(i/2)+1): if i%j == 0: factors.append(j) if sum(factors) == i: print(i, end=',')
如何在Python中拷贝一个对象, 并说明他们之间的区别?
有三种方法:赋值、浅拷贝、深拷贝
区别:
赋值:只是复制了新对象的引用,不会开辟新的内存空间。
浅拷贝:创建新对象,其内容是原对象的引用。
#三种方法: """ #切片操作: lst = [1,2,3,[4,5]] lst1 = lst[:] #或者:lst1 = [each for each in lst] """ """ #工厂函数: lst = [1,2,3,[4,5]] lst1 = list(lst) """ #copy函数 lst = [1,2,3,[4,5]] lst1 = copy.copy(lst)
浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在lst中有一个嵌套的list[4,5],如果我们修改了它,情况就不一样了。
深拷贝:只有一种形式,copy模块中的deepcopy函数; 和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素;深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。(copy.deepcopy)
- #1.外层添加元素时, 浅拷贝c不会随原列表a变化而变化;内层list添加元素时,浅拷贝c才会变化。
- #2.无论原列表a如何变化,深拷贝d都保持不变。
- #3.赋值对象随着原列表一起变化