返回顶部
首页 > 资讯 > 后端开发 > Python >通过源码分析Python中的切片赋值
  • 248
分享到

通过源码分析Python中的切片赋值

赋值切片源码 2022-06-04 18:06:27 248人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本文主要介绍的关于python切片赋值的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 昨天有同学问了我这么个问题: t = [1, 2, 3] t[1:1] = [7] # 感谢@一往

本文主要介绍的关于python切片赋值的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

昨天有同学问了我这么个问题:


t = [1, 2, 3]
t[1:1] = [7] # 感谢@一往直前 的疑问,之前写为 t[1:1] = 7了
print t # 输出 [1, 7, 2, 3]

这个问题之前还真没遇到过,有谁会对列表这么进行赋值吗?不过对于这个输出结果的原因确实值得去再了解下,毕竟之前也看过《Python源码分析》。(题外话:据说最近有大牛在写新的版本)

想着今天有空看看Python的源码,去了解下原理是什么。

注:我本地之前下载的是Python2.7.6的代码,直接看的这个。

在Objects/listobject.c中有一个 PyList_SetSlice 函数,是这么写的:


int
PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
{
 if (!PyList_Check(a)) {
  PyErr_BadInternalCall();
  return -1;
 }
 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
}

有用的一句就是 list_ass_slice ,那么再来看看这个函数的代码:


static int
list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
{
 
 PyObject *recycle_on_stack[8];
 PyObject **recycle = recycle_on_stack; 
 PyObject **item;
 PyObject **vitem = NULL;
 PyObject *v_as_SF = NULL; 
 Py_ssize_t n; 
 Py_ssize_t norig; 
 Py_ssize_t d; 
 Py_ssize_t k;
 size_t s;
 int result = -1;   
#define b ((PyListObject *)v)
 if (v == NULL)
  n = 0;
 else {
  if (a == b) {
   
   v = list_slice(b, 0, Py_SIZE(b));
   if (v == NULL)
    return result;
   result = list_ass_slice(a, ilow, ihigh, v);
   Py_DECREF(v);
   return result;
  }
  v_as_SF = PySequence_Fast(v, "can only assign an iterable");
  if(v_as_SF == NULL)
   Goto Error;
  
  n = PySequence_Fast_GET_SIZE(v_as_SF);
  vitem = PySequence_Fast_ITEMS(v_as_SF);
 }
 if (ilow < 0)
  ilow = 0;
 else if (ilow > Py_SIZE(a))
  ilow = Py_SIZE(a);

 if (ihigh < ilow)
  ihigh = ilow;
 else if (ihigh > Py_SIZE(a))
  ihigh = Py_SIZE(a);

 norig = ihigh - ilow;
 assert(norig >= 0);
 d = n - norig;
 if (Py_SIZE(a) + d == 0) {
  Py_XDECREF(v_as_SF);
  return list_clear(a);
 }
 item = a->ob_item;
 
 s = norig * sizeof(PyObject *);
 if (s > sizeof(recycle_on_stack)) {
  recycle = (PyObject **)PyMem_MALLOC(s);
  if (recycle == NULL) {
   PyErr_NoMemory();
   goto Error;
  }
 }
 memcpy(recycle, &item[ilow], s);

 if (d < 0) { 
  memmove(&item[ihigh+d], &item[ihigh],
   (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
  list_resize(a, Py_SIZE(a) + d);
  item = a->ob_item;
 }
 else if (d > 0) { 
  k = Py_SIZE(a);
  if (list_resize(a, k+d) < 0)
   goto Error;
  item = a->ob_item;
  printf("关键点n");
  
  memmove(&item[ihigh+d], &item[ihigh],
   (k - ihigh)*sizeof(PyObject *));
 }
 
 for (k = 0; k < n; k++, ilow++) {
  PyObject *w = vitem[k];
  Py_XINCREF(w);
  item[ilow] = w;
 }
 for (k = norig - 1; k >= 0; --k)
  Py_XDECREF(recycle[k]);
 result = 0;
Error:
 if (recycle != recycle_on_stack)
  PyMem_FREE(recycle);
 Py_XDECREF(v_as_SF);
 return result;
#undef b
}

看了知乎,stackoverflow上的解答,发现源码还是最好的解释。上述关键位置已经加了注释,应该很好理解。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程网的支持。

--结束END--

本文标题: 通过源码分析Python中的切片赋值

本文链接: https://lsjlt.com/news/13310.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 通过源码分析Python中的切片赋值
    本文主要介绍的关于Python切片赋值的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 昨天有同学问了我这么个问题: t = [1, 2, 3] t[1:1] = [7] # 感谢@一往...
    99+
    2022-06-04
    赋值 切片 源码
  • python怎么赋值字符串的切片
    要将字符串的切片赋值给一个新的变量,可以使用以下语法: new_string = old_string[start:end] 其中,...
    99+
    2023-10-26
    python
  • go语言中的二维切片赋值
    先用append填充一维的,然后将一维append到二维 代码如下 var a [][]int for i := 0; i < 10; i++ { var t...
    99+
    2022-06-07
    GO 二维 赋值 go语言
  • Spring中AOP的切点、通知和切点表达式源码分析
    这篇文章主要介绍了Spring中AOP的切点、通知和切点表达式源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring中AOP的切点、通知和切点表达式源码分析文章都会有所收获,下面我们一起来看看吧。1...
    99+
    2023-07-05
  • Python数据分析模块Numpy切片、索引和广播源码分析
    这篇文章主要讲解了“Python数据分析模块Numpy切片、索引和广播源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python数据分析模块Numpy切片、索引和广播源码分析”吧!N...
    99+
    2023-07-06
  • python opencv通过按键采集图片源码
    一、python版本 写了个python opencv的小demo,可以通过键盘按下字母s进行采集图像。 功能说明 “N” 新建文件夹 data/ 用来存储图像 “S” 开始采集图像,将采集到的图像放到 data/...
    99+
    2022-06-02
    python opencv按键采集图片 opencv图像采集
  • 通过返回切片的值来更新 GORM 中的记录?
    有志者,事竟成!如果你在学习Golang,那么本文《通过返回切片的值来更新 GORM 中的记录?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往...
    99+
    2024-04-05
  • 通过源码分析Golang cron的实现原理
    目录前言Demo示例源码实现结构体 Cron 和 EntryNew()实现AddFunc()实现Start()实现Run()实现Stop()实现Remove()实现小结前言 gola...
    99+
    2024-04-02
  • Python中的jieba源码分析
    本篇内容主要讲解“Python中的jieba源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的jieba源码分析”吧!前言jieba分词是Python 里面几个比较流行的中文...
    99+
    2023-06-02
  • 通过源码分析iOS中的深拷贝与浅拷贝
    前言 关于iOS中对象的深拷贝和浅拷贝的文章有很多,但是大部分都是基于打印内存地址来推导结果,这篇文章是从源码的角度来分析深拷贝和浅拷贝。 深拷贝和浅拷贝的概念 拷贝的方式有两种:...
    99+
    2022-06-04
    源码 深拷贝 浅拷贝
  • python中list列表复制的几种方法(赋值、切片、copy(),deepcopy())
    目录1、浅拷贝和深拷贝2、直接赋值3、for循环4、切片5、copy()方法(1)list.copy()方法(2)copy.copy()方法6、deepcopy()方法1、浅拷贝和深...
    99+
    2024-04-02
  • 通过JDK源码角度分析Long类详解
    概况Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其他类型之间的转换方法。除此之外还有一些位相...
    99+
    2023-05-30
    jdk源码 long类 j
  • 通过JDK源码分析关闭钩子详解
    关闭钩子用户关闭关闭程序,需要做一些善后的清理工作,但问题是,某些用户不会按照推荐的方法关闭应用程序,肯能导致善后工作无法进行。像tomcat调用server的start方法启动容器,然后会逐级调用start。当发出关闭命令是会启动关闭功能...
    99+
    2023-05-30
    jdk源码 关闭钩子 java
  • python的变量与赋值详细分析
    python的变量与赋值 1.变量的命名规则 变量其实通过一个标记调用内存中的值,而变量名就是这个标记的名称,但是万一这个标记已经被提前占用或者解释器认为这个标记是不合法的,那么就会报错。下面总结了一下变...
    99+
    2022-06-04
    赋值 变量 详细
  • Golang通道channel的源码分析
    目录前言channel基础结构channel初始化channel发送channel接收小结前言 channel是golang中标志性的概念之一,很好很强大! channel(通道),...
    99+
    2022-12-08
    Golang通道channel Golang通道 Golang channel
  • python中opencv通过4坐标剪裁图片的示例分析
    这篇文章主要介绍python中opencv通过4坐标剪裁图片的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文主要介绍了python opencv通过4坐标剪裁图片,分享给大家,具体如下:效果展示, 裁剪出...
    99+
    2023-06-15
  • python中列表的索引与切片实例分析
    这篇文章主要介绍了python中列表的索引与切片实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中列表的索引与切片实例分析文章都会有所收获,下面我们一起来看看吧。python中列表的常见操作列...
    99+
    2023-07-02
  • PHP中null判断赋值的示例分析
    小编给大家分享一下PHP中null判断赋值的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!null判断赋值几种写法//当...
    99+
    2024-04-02
  • 如何通过fastclick源码分析彻底解决tap“点透”
    这篇文章主要为大家展示了“如何通过fastclick源码分析彻底解决tap“点透””,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何通过fastclick源码分...
    99+
    2024-04-02
  • ECMAScript6变量中解构赋值的示例分析
    这篇文章主要介绍了ECMAScript6变量中解构赋值的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。数组的解构赋值ES6允许按照一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作