python列表切片赋值_Python中对切片赋值原理分析

有这么个问题::t = [1, 2, 3]

t[1:1] = [7]

print t  # 输出 [1, 7, 2, 3]

谁会对列表这么进行赋值呢?但是对于这个输出结果的原因确实值得去再了解下,今天看看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)

{

/* Because [X]DECREF can recursively invoke list operations on

this list, we must postpone all [X]DECREF activity until

after the list is back in its canonical shape.  Therefore

we must allocate an additional array, 'recycle', into which

we temporarily copy the items that are deleted from the

list. :-( */

PyObject *recycle_on_stack[8];

PyObject **recycle = recycle_on_stack; /* will allocate more if needed */

PyObject **item;

PyObject **vitem = NULL;

PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */

Py_ssize_t n; /* # of elements in replacement list */

Py_ssize_t norig; /* # of elements in list getting replaced */

Py_ssize_t d; /* Change in size */

Py_ssize_t k;

size_t s;

int result = -1;            /* guilty until proved innocent */

#define b ((PyListObject *)v)

if (v == NULL)

n = 0;

else {

if (a == b) {

/* Special case "a[i:j] = a" -- copy b first */

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

*/

n = PySequence_Fast_GET_SIZE(v_as_SF);

vitem = PySequence_Fast_ITEMS(v_as_SF);

}

if (ilow 

ilow = 0;

else if (ilow > Py_SIZE(a))

ilow = Py_SIZE(a);

if (ihigh 

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;

/* recycle the items that we are about to remove */

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 

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) { /* Insert d items */

k = Py_SIZE(a);

if (list_resize(a, k d) 

goto Error;

item = a->ob_item;

printf("关键点\n");

/*

把list对应切片后一位的值之后的所有内容向后移动所赋值的大小

按照上面的python代码这里就是

原理的t:

|1|2|3|

后移一位,因为len([7]) = 1

|1|空|2|3|把后两个移位

*/

memmove(&item[ihigh d], &item[ihigh],

(k - ihigh)*sizeof(PyObject *));

}

/*

赋值操作,即把[7]赋值到t里的对应位置上

ilow是1, n是1

*/

for (k = 0; k 

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

}

源码内有详细注释,编程问题的研究最好的解释还是源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】

题目 FOTILE得到了一个长为N的序列A&#xff0c;为了拯救地球&#xff0c;他希望知道某些区间内的最大的连续XOR和。 即对于一个询问&#xff0c;你需要求出max(Ai xor Ai1 xor Ai2 ... xor Aj)&#xff0c;其中l<i<j<r。 为了体现在线操作&#xff0c;对于一个询问(x…

php输出mysql的数据结构_php课程 13-43 mysql的数据结构是什么

php课程 13-43 mysql的数据结构是什么一、总结一句话总结&#xff1a;cs结构&#xff0c;客户端&#xff0c;服务器1、常用的比较出名的数据库有哪些&#xff1f;SQL数据库(关系型):1.收费:DB2SqlserverOracle2.开源免费MysqlSqlitePostgresqlNOSQL数据库(非关系型):1.MongoDB(…

11大领域148个热点和新兴前沿发布!有你的化学与材料研究方向吗?

来源&#xff1a;科学网 作者&#xff1a;郑金武11月13日&#xff0c;中国科学院科技战略咨询研究院、中国科学院文献情报中心与科睿唯安联合向全球发布了《2020研究前沿》报告。报告基于2014年-2019年的论文数据&#xff0c;遴选展示了在农业科学、植物学和动物学&#xff0c…

List注意啊

java.unit工具类&#xff0c;例如&#xff1a;Map、List等 java.awt图形绘制类&#xff0c;例如&#xff1a;list组件可以为用户提供了一个可滚动的文件列表选项&#xff0c;可设置list使其为用户提供单项或多项选择 我在第一次使用List的时候&#xff0c;包导入了第二个&#…

python中反斜杠_Python中的正斜杠/与反斜杠\

知识点&#xff1a;1. "/"左倾斜是正斜杠&#xff0c;"\"右倾斜是反斜杠&#xff0c;可以记为&#xff1a;除号是正斜杠2. 对于目录分隔符&#xff0c;Unix和Web用正斜杠/&#xff0c;Windows用反斜杠\。(一)目录中的斜杠python读文件需要输入的目录参数&a…

git idea 图形化_Git大全,你所需要的Git资料都在这里

不管怎样&#xff0c;Git已经成为事实上的版本管理工具的王者&#xff0c;之前的CVS被SVN吃掉了&#xff0c;现如今SVN的大好河山也被Git蚕食了大半&#xff0c;作为开发者的你&#xff0c;如果还不能够熟练的使用Git来管理你的代码&#xff0c;后果将会很严重&#xff0c;何况…

是否同一棵二叉搜索树

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而&#xff0c;一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树&#xff0c;都得到一样的结果。于是对于输入的各种插入序列&#xff0c;你需要判断它们…

perl mysql dml_MySQL Connector执行SQL语句的三种方式

描述当我们需要在Java程序中与数据库进行交互&#xff0c;可能首先想到的是使用某个ORM框架&#xff0c;因为ORM框架封装了一些实现细节&#xff0c;在使用上非常方便&#xff0c;并且一定程度上可以提升代码稳定性。在ORM框架中&#xff0c;都会依赖MySQL Connector包&#xf…

修改软件许可证使用时间_阮一峰:为什么开源数据库改变许可证?

CockroachDB 是一个开源的分布式数据库&#xff0c;最近改变了代码授权&#xff0c;放弃了 Apache 许可证。许多开源数据库这一两年都改变了授权&#xff0c;比如 Confluent、Elastic 、MongoDB、Redis Labs、TimescaleDB。本文分析这种现象。一、CockroachDB 的许可证变更Cock…

mysql数据库设计三大范式_数据库设计三大范式详解

引言数据库的设计范式是数据库设计所需要满足的规范&#xff0c;满足这些规范的数据库是简洁的、结构明晰的&#xff0c;同时&#xff0c;不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟&#xff0c;不仅给数据库的编程人员制造麻烦&#xff0c;…

Broadcast简单使用

Activity Service之间的通信单用intent有时候还是不能满足要求&#xff0c;毕竟intent只能在启动一个activity的时候传一点消息过去 这个时候就用到广播了&#xff0c;至此&#xff0c;四大组件Activity Broadcast Service ContentProvider中终于用过三个了。。。当然目前只是…

线程 sleep 取消_C/C++ 多线程机制

一、C/C多线程操作说明C/C多线程基本操作如下&#xff1a; 1. 线程的建立结束 2. 线程的互斥和同步 3. 使用信号量控制线程 4. 线程的基本属性配置 在C/C代码编写时&#xff0c;使用多线程机制&#xff0c;首先需要做的事情就是声明引用&#xff0c;具体如下&#xff1a;#inclu…

Windows + Ubuntu下JDK与adb/android环境变量配置完整教程

假设JDK和android sdk路径分别如下&#xff1a; D:\Program Files\Java\jdkD:\android-sdk 1.JDK环境变量配置JAVA_HOMED:\Program Files\Java\jdk path%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; classpath,;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar &a…

python制作界面怎么触发事件_python模拟事件触发机制详解

本文实例为大家分享了python模拟事件触发机制的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下EventManager.py# -*- encoding: UTF-8 -*-# 系统模块from queue import Queue, Emptyfrom threading import *class EventManager:def __init__(self):"""…

python 格式化工具_小而美的 Python 格式化工具--black

Black号称不妥协的代码格式化工具&#xff0c;为什么叫不妥协呢&#xff1f;因为它检测到不符合规范的代码风格直接就帮你全部格式化好&#xff0c;根本不需要你确定&#xff0c;直接替你做好决定。它也是 requests 作者最喜欢的工具之一.使用非常简单&#xff0c;安装成功后&a…

常用英语短语收集1

1、are you fucking kiding me&#xff1f; 转载于:https://www.cnblogs.com/badboys/p/8729474.html

事务java_Java事务之一——Java事务的基本问题

Java中的事务处理有多简单&#xff1f;在使用EJB时&#xff0c;事务在我们几乎察觉不到的情况下发挥着作用&#xff1b;而在使用Spring时&#xff0c;也只需要配置一个TransactionManager&#xff0c;然后在需要事务的方法上加上Transactional注解就行了。Java的事务处理之所以…

seo模拟点击软件_浅谈百度SEO快排是什么、原理、如何判断及应对

前言&#xff1a;以前我说过不准备写这个快排&#xff0c;一是我自己的网站没有操作过所谓的快排 &#xff0c;二是我并不能像网上很多写的揭秘百度快排(说实话&#xff0c;你都能揭秘的方法了&#xff0c;还真的很有用吗?真正懂的人都在低调赚money)。我只是站在一个小白角度…

冲刺no.4

项目:ccsu小助手 角色:用户 访问链接:http://47.93.57.6:8888/login/ 目的(Purpose) ccsu小助手是一款面向长沙学院所有学生、老师、学校部门、校园的账户信息输出类产品&#xff0c;部门可以通过和本系统负责人签订产品使用协议&#xff0c;申请集成使用该产品 对应网页使用权…

java web 开发基础_javaweb开发基础(一)

001使用MyEclispe建立web工程我的建立在D盘WebAPP这个目录下在myeclipse中启动Tomcat&#xff0c;在浏览器中输入http://localhost:8080/&#xff0c;如果不出意外的话&#xff0c;会出现白板&#xff0c;说明Tomcat启动成功。这篇文档则详细的说明了如何在MyEclipse下部署一个…