学习时间复杂度时, 一些问题的描述和记录。
# 列表的添加中两个操作
def t1():
li = []
for i in range(10000):
li = li + [i]
def t2():
li = []
for i in range(10000):
li += [i]
上述代码的结果是一致的,但是两个函数计算时所用的时间完全不是一个数量级的。
原因是列表在使用四则运算时, li的内存地址每次都会重新的建立并被赋值, 而赋值运算则一直使用第一个li的内存地址。
由此又有:
str1 = 'a'
print(id(str1))
str1 = str1 + 'b'
print(id(str1))
str2 = 'a'
print(id(str2))
str2 += 'b'
print(id(str2))
def test():
str3 = 'a'
print(id(str3))
test()
# 结果
4755896
32050176
4755896
32081152
4755896
可以发现, 字符串进行运算时, 无论是四则运算还是赋值运算都会开辟新的内存空间, 但是声明时的内容始终指向同一内存空间, 因此声明字符串后, 运算后, 原始字符串并没有从内存中回收, 而后面使用到时, 都会指向新的引用。
那如果再次进行运算呢?
str1 = 'a'
print(id(str1))
str1 = str1 + 'b'
print(id(str1))
str1 = str1 + 'c'
print(id(str1))
str2 = 'a'
print(id(str2))
str2 += 'b'
print(id(str2))
str2 += 'c'
print(id(str2))
# 结果
31297976
41945832
41945832
31297976
41946056
41946056
我们发现, 当引用第一次运算后, 无论是哪一种运算规则都会采用第一次运算时所开辟的内存空间, 原始字符串引用地址依旧如上。