a=list#[1,2,3,4,5,6,7].
切片的使用可以看做[start??其中,start、end、interval有时候可以省略。列表a中每个数字对应正、负两个索引,如a[2]=a[-5]=3,这是因为在python中,第一个元素对应的下标为0,最后一个元素对应的下标为-1,所以从对于3这个数字,从左往右索引就是2,从右往左索引就是-5。如果有interval,先确定其方向。a[:10:-1]#[]先看interval为负值,故从右往左取,取到下标为10的前一个为止,但是从左到右取最大的下标也才是a[6],故返回[]
先构造一个list列表a:
a = list(range(1,8)) # [1, 2, 3, 4, 5, 6, 7]
切片的使用可以看做 [start??interval],三者的取值可正可负。其中,start、end、interval有时候可以省略。
列表a中每个数字对应正、负两个索引,如 a[2] = a[-5] = 3,这是因为在python中,第一个元素对应的下标为0,最后一个元素对应的下标为-1,所以从对于3这个数字,从左往右索引就是2,从右往左索引就是-5。
值得注意的是,interval中的正负号规定了取数的方向是从左到右(+)还是从右到左(-)。如果有interval,先确定其方向(没有的话默认为从左到右取数)。
切片的应用:
a[:3] # [1,2,3] 即索引是 [0,3) => a[0]、a[1]、a[2]
a[:-5] # [1,2] 等价于 a[:(-5+a中元素个数7)] = a[:2] = [1,2]
a[:5:2] # [1,3,5] 先取前5个元素,然后按照间隔2取数
a[:4:-1] # [7,6] 先看interval为负值,故从左往右取,取到下标为4的前一个为止,即能取到a[6]、a[5]
a[:3:-2] # [7,5] 先看interval为负值,故从右往左取,取到下标为3的前一个为止,即能取到a[6]、a[5]、a[4],然后按照间隔2取数
a[:-5:-1] # [7,6,5,4] 先看interval为负值,故从右往左取,取到下标为-5的前一个为止,即能取到a[-1]、a[-2]、a[-3]、a[-4]
a[:10] # [1,2,3,4,5,6,7] 即索引是 [0,10),超过不报错
a[:10:-1] # [] 先看interval为负值,故从右往左取,取到下标为10的前一个为止,但是从左到右取最大的下标也才是a[6],故返回[]
a[:-100:-1] # [7,6,5,4,3,2,1] 先看interval为负值,故从右往左取,取到下标为-100的前一个为止,即能取到a[-1]、a[-2]、a[-3]、a[-4]、a[-5]、a[-6]、a[-7]
a[::-1] # [7,6,5,4,3,2,1] 先看interval为负值,故从右往左取,取到头(因为end没有指定)为止,即能取到a[-1]、a[-2]、a[-3]、a[-4]、a[-5]、a[-6]、a[-7] ,该方法也是list反转的方法
a[::2] # [1,3,5,7] 每隔2个元素取数
a[3::2] # [4,6] 从a[3]=4开始,每隔2个元素取数
a[:-2] # [1,2,3,4,5]
a[-6:10] # [2,3,4,5,6,7]
a[-4::-1] # [4,3,2,1]
a[-1:-5:-2] # [7,5]
b = a[:4] + a[5:] # [1, 2, 3, 4, 6, 7],切片法去除list中一个元素
Python切片操作为什么就不包含最后一个值
其他语言很多都类似,一个范围,基本都是前包,后不包,
比如java
String str = "ABC+-DEF";
String str2 = str.substring(3,5));//想取得+-.就得从3~5,索引包括3,不包括5
System.out.println(str2);//输出+-
python也一样
s1 = "ABC+-DEF"
s2 = s1[3:5]
print s2 # +-
为了便于理解,可以这样想. 3:5 其实就是3:(3+2) 从3开始,要取2个字符,所以就是3+2=5
python中的字符串切片是什么意思呢,下面语句str1[...
str1=u'我是派森'3printstr1[2:4]...
str1 = u'我是派森' 3
print str1[2:4]
代表的是从第3个字符开始,的两个字符
即第三个字符到第四个字符
str1[0] 即第一个字符
data-log="fm:oad,pos:oad-ti,si:3,relv:0,st:2"python可以做什么
对列表切片进行赋值,解释器处理时是直接将序列中的内容赋值过去的,还是先将不是列表的序列转成列表再进行赋值的呢?...
对列表切片进行赋值,解释器处理时是直接将序列中的内容赋值过去的 ,还是先将不是列表的序列转成列表再进行赋值的呢?
切片赋值,得到的与原变量无关,是两个不同的对象;直接赋值,引用的是同一个对象。
请看下例
1、直接赋值。
a=[0,2,3,0]
b=a
print b
del(a[1])
print b
这样写得到的结果是:
[0, 2, 3, 0]
[0, 3, 0]
2、切片赋值。
a=[0,2,3,0]
b=a[:]
print b
这样写得到的结果是
del(a[1])
print b
[0, 2, 3, 0]
[0, 2, 3, 0]
是不一样吧?
3、现对它们的id做一下输出就会发现问题所在;
(1)直接赋值得到的id是一样的:
[0, 2, 3, 0]
[0, 3, 0]
id(b): 83565448 id(a): 83565448
(2)切片赋值得到的id:
[0, 2, 3, 0]
[0, 2, 3, 0]
id(b): 83250504 id(a): 83250056
追问
额 我是不表达的有问题。
我的意思是列表切片在左
比如 a=[1,2,3,4,5,6]
a[3:]='abc'
这个在处理时会不会类似于C中 如double a=5 这样出现类型不匹配,解释器处理时会不会先把赋值号右边的转成列表['a','b','c']再进行赋值处理呢
python 列表切片赋值
切片需要用到步长。
把100个学生排成队,从其中每隔一个人拉出来一个组成的结果是切片,此时步长为2.
python中切片和步长的区别
go有切片slice类型,python有列表和元组,这两种语言都有切片操作。
但是它们的切片操作是完全不同的。
首先说第一个,go的切片,其成员是相同类型的,python的列表和元组则不限制类型。
两种语言都有[a:b]这种切片操作,意义也类似,但是go的a、b两个参数不能是负数,python可以是负数,此时就相当于从末尾往前数。
两种语言都有[a:b:c]这种切片操作,意义却是完全不同的。go的c,表示的是容量;而python的c表示的是步长。
但是最大的不同,还是:
python的切片产生的是新的对象,对新对象的成员的操作不影响旧对象;go的切片产生的是旧对象一部分的引用,对其成员的操作会影响旧对象。
究其原因,还是底层实现的不同。
go的切片,底层是一个三元组,一个指针,一个长度,一个容量。指针指向一块连续的内存,长度是已有成员数,容量是最大成员数。切片时,一般并不会申请新的内存,而是对原指针进行移动,然后和新的长度、容量组成一个切片类型值返回。也就是说,go的切片操作通常会和生成该切片的切片共用内存。
不仅是切片,字符串、数组的切片也是一样的,通常会共用内存。
当然也有异常情况,那就是切片时,提供的容量过大,此时会申请新内存并拷贝;或者对切片append超出容量,也会如此。这时,新的切片,才不会和老切片共享内存。(如果你切片/创建时提供的容量小于长度,会panic)
python的列表,其实是个指针数组。当然在下层也会提供一些空位之类的,但基本就是个数组。对它们切片,会创建新的数组,注意,是创建新的数组!python的列表可没有容量的概念。
这其实也体现了脚本语言和编译语言的不同。虽然两个语言都有类似的切片操作;但是python主要目标是方便;go主要目标却是快速(并弥补丢弃指针运算的缺陷)。 a
go和python切片的不同
比如,a=[1,2,3]我想要取得[1,3]怎么切片....解决方法应该是a[::2]...
比如,a=[1,2,3]
我想要取得[1,3]怎么切片
....解决方法应该是
a[::2]
python切片问题,怎么不要中间的,截取两边
字符串
列表
元组
字典
切片只是一种称呼,所谓切片,就相当于对一个长条面包切下一片,比如说我们想取s字符串中的第2到第5个字符,也可以叫切片。
python哪些可以切片
切片的语法:[起始:结束:步长]ps:选取的区间属于左闭右开型,即从“起始”位开始,到”结束“位的前一位结束(注意:不包含结束位本身)name="zhang"代码[1]:name[::-2]输出[1]:'ga...
切片的语法:[起始:结束:步长]
ps:选取的区间属于左闭右开型,即从“起始”位开始,到”结束“位的前一位结束(注意:不包含结束位本身)
name="zhang"
代码[1]: name[::-2]
输出[1]: 'gaz'
代码[2]: name[4:1:-2]
输出[2]: 'ga'
代码[3]: name[4:1:2]
输出[3]: ''
这三个地方不太理解,请分别解释下
展开
name = "1234567890"
print(name)
print(name[::-2])#倒序,每两个取一个。
print(name[4:1:-2]) #从4倒序到1,每两个取一个。
print(name[8:1:-2]) #从8倒序到1,每两个取一个。
str[0:3] #截取第一位到第三位的字符
str[:] #截取字符串的全部字符
str[6:] #截取第七个字符到结尾
str[:-3] #截取从头开始到倒数第三个字符之前
str[2] #截取第三个字符
str[-1] #截取倒数第一个字符
str[::-1] #创造一个与原字符串顺序相反的字符串
str[-3:-1] #截取倒数第三位与倒数第一位之前的字符
str[-3:] #截取倒数第三位到结尾
str[:-5:-3] #逆序截取
python切片的一些问题
初学python,请大家指导,谢谢!下面的变量,直接通过列表来赋值和通过切片来赋值的结果是不同的,第一次我的理解是,mylist也指向了shoplist指向的对象第二次的赋值我我就不知道怎么...
初学python,请大家指导,谢谢!
下面的变量,直接通过列表来赋值和通过切片来赋值的结果是不同的,
第一次我的理解是,mylist也指向了shoplist指向的对象
第二次的赋值我我就不知道怎么理解了,请大神指教。
请问列表切片的赋值怎么理解,地址是怎么变的,在内存上怎么存储的?
>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> id(shoplist)
27138648
>>> mylist = shoplist
>>> id(mylist)
27138648
>>> mylist = shoplist[:]
>>> id(mylist)
27138728
>>>
展开
>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> id(shoplist)
27138648
这三句相当于吹了一个汽球,系了根线,将这根线交给A;
……
>>> mylist = shoplist
>>> id(mylist)
27138648
这三句相当于,将刚才的汽球又系了根线,并交给B;此时A和B虽然都牵了根线,但汽球是同一个;
……
mylist = shoplist[:]
>>> id(mylist)
27138728
这三句,相当于重新吹了一个和刚才一模一样的汽球,系了根线,并交到C的手上;
综上所述,汽球是实际对象,id是内存地址的映射;也就是说一个对象可以有多个引用;此时顺着B手上的线把汽球戳破了,A线上的汽球也就不存在了;
换言之列表直接赋值,只是多了一个引用;slice()方法会将范围内列表复制一个出来,并分本新地址变量,与原来的无关了;这在官方文档的介绍中有说明。
本文详细介绍了Python列表的切片操作,包括如何使用切片获取列表子集,以及切片的语法 `[start:end:step]`。文中通过实例解析了切片中的start、end、step的正负值对取数方向的影响,并展示了切片在列表反转、删除元素等方面的应用。此外,还探讨了切片赋值时新旧对象的关系,指出切片赋值会产生新的对象,而直接赋值则会共享同一对象。
1万+

被折叠的 条评论
为什么被折叠?



