Py学习  »  Python

python切片和替换

HelloWorld • 5 年前 • 1469 次点击  

我试图更好地理解python切片,以及它如何在数组变异的上下文中工作。这个到位了吗?是O(1)内存还是更少?这条线上发生了什么?

例如,如果nums是数组,f是整数。在哪里? nums = [1, 2, 3, 4, 5, 6, 7] f = 3 .

nums[:] = nums[-f:] + nums[:-f] 

nums[:] 使用内存?我知道 nums[-f:] + nums[:-f] 基于f重新分配值,但是加法的作用是什么?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46070
 
1469 次点击  
文章 [ 1 ]  |  最新文章 5 年前
ggorlen
Reply   •   1 楼
ggorlen    5 年前

这将根据 f . [-f:] 提取最后一个 f 作为新列表的列表元素和 [:-f] 将列表的开头提取到 len(nums) - f 作为一个新的列表。

nums[:] 使用内存临时存储删除的对象( recycle_on_stack / recycle )把新的复制到列表中。 [:] 意味着我们要穿越整个建筑 norig 是名单的全部长度,我们必须

s = norig * sizeof(PyObject *);
memcpy(recycle, &item[ilow], s);

在整个名单上。见 source code .

切片赋值发生变化 nums in place ,有点像拼接操作,但在本例中没有必要使用它,因为直接赋值将获得相同的结果:

nums = nums[-f:] + nums[:-f]

+ 在这种情况下 list concatenation . 操作将创建并返回一个新列表。但是,自从 小精灵 如果被覆盖,则其上一个值将转到垃圾收集器(如果没有其他对象引用它)。

我在数至少4整本 纽斯 在上面的例子中(这两个切片相加为一个,一个用于连接,另两个用于切片分配)。