将 python 列表转换为元组的时间复杂度是多少(反之亦然):
tuple([1,2,3,4,5,6,42])
list((10,9,8,7,6,5,4,3,1))
O(N) 或 O(1),即列表是否被复制或内部某处从可写切换为只读?
非常感谢!
将 python 列表转换为元组的时间复杂度是多少(反之亦然):
tuple([1,2,3,4,5,6,42])
list((10,9,8,7,6,5,4,3,1))
O(N) 或 O(1),即列表是否被复制或内部某处从可写切换为只读?
非常感谢!
这是一个 O(N) 操作,tuple(list) 只是将对象从列表复制到元组。因此,您仍然可以修改内部对象(如果它们是可变的),但您不能向元组添加新项目。
复制列表需要O(N)
时间。
>>> tup = ([1, 2, 3],4,5 ,6)
>>> [id(x) for x in tup]
[167320364, 161878716, 161878704, 161878692]
>>> lis = list(tup)
内部对象仍然引用相同的对象
>>> [id(x) for x in lis]
[167320364, 161878716, 161878704, 161878692]
但是外部容器现在是不同的对象。因此,修改外部对象不会影响其他对象。
>>> tup is lis
False
>>> lis.append(10)
>>> lis, tup
([[1, 2, 3], 4, 5, 6, 10], ([1, 2, 3], 4, 5, 6)) #10 not added in tup
修改一个可变的内部对象会影响两个容器:
>>> tup[0].append(100)
>>> tup[0], lis[0]
([1, 2, 3, 100], [1, 2, 3, 100])
时序比较表明,列表复制和元组创建花费的时间几乎相同,但由于创建具有新属性的新对象有开销,因此创建元组的成本略高。
>>> lis = range(100)
>>> %timeit lis[:]
1000000 loops, best of 3: 1.22 us per loop
>>> %timeit tuple(lis)
1000000 loops, best of 3: 1.7 us per loop
>>> lis = range(10**5)
>>> %timeit lis[:]
100 loops, best of 3: 2.66 ms per loop
>>> %timeit tuple(lis)
100 loops, best of 3: 2.77 ms per loop
据我了解,没有什么可切换的,因为列表(可变)对象与元组(不可变)对象完全不同。他们有不同的方法等。
您可能会做的一个实验是:
>>> a = [1,2,3,4,5]
>>> a = (1,2,3,4,5)
>>> a
(1, 2, 3, 4, 5)
>>> b = list(a)
>>> b
[1, 2, 3, 4, 5]
>>> b[2] = 'a'
>>> b
[1, 2, 'a', 4, 5]
>>> a
(1, 2, 3, 4, 5)
看,如果他们引用了内存中的确切位置,那么a
也应该改变。
这是为了我的理解。