[:]做什么?

时间:2010-11-15 22:23:45

标签: python

return self.var[:]

会有什么回报?

5 个答案:

答案 0 :(得分:9)

Python允许您“切片”各种容器类型;这是对有序集合进行一些子集合的简写表示法。例如,如果您有一个列表

foo = [1,2,3,4,5]

你想要第二,第三和第四个元素,你可以这样做:

foo[1:4]

如果省略切片中的某个数字,则默认为列表的开头。所以例如

foo[1:] == [2,3,4,5]
foo[:4] == [1,2,3,4]

当然,如果省略切片中的两个数字,您将获得整个列表!但是,您将获得列表的副本而不是原始列表;实际上,这是复制列表的标准符号。请注意区别:

>>> a = [1,2,3,4]
>>> b = a
>>> b.append(5)
>>> a
[1, 2, 3, 4, 5]
>>>
>>> a = [1,2,3,4]
>>> b = a[:]
>>> b.append(5)
>>> a
[1, 2, 3, 4]

这是因为b = a告诉b指向与a相同的对象,因此追加b与追加a相同。复制列表a可以避免这种情况。请注意,这只会运行一个间接深度 - 如果a包含一个列表,比如说,并且您在b中附加到该列表,则仍会更改a

顺便说一句,切片有一个可选的第三个参数,它是一个 step 参数 - 它允许你在大于1的跳转中移动列表。所以你可以写范围(100)[0 :: 2]表示所有偶数,最多100个。

答案 1 :(得分:5)

如果self.varmutable sequence,则会返回该序列的shallow copy

如果self.var是不可变的built-in sequence,例如stringtuple,则大多数实现都会返回self.var本身。

答案 2 :(得分:2)

这将创建列表的浅表副本,并将其返回。

“浅拷贝”,而不是“深拷贝”,意味着该列表将仅在其中创建引用的新副本,而不是实际对象。也就是说,将创建具有相同对象引用的新列表,但对象本身将保持不变。

如果从原始项目中删除项目,则新列表不会受到影响,但如果您更改里面的元素之一(通过调用方法或设置对象属性,例如),元素也会在新列表中更改,因为虽然它们是不同的列表,但它们指向相同的对象。

答案 3 :(得分:2)

它被称为列表切片:

[从:至:跳过]

[从:至]

所以,如果我说:

list = range(20)
print list[1:3] #returns [2, 3]
print list[1:12:3] #returns [2, 5, 8, 11]
print list[14:] #because theres no end: [15, 16, 17, 18, 19]
print list[14:-2] #-2 from the end: [15, 16, 17]

答案 4 :(得分:1)

您可以通过以下方式使用带有列表的运算符:

列表= [1,2,3,4,5,6,7,8,9]

单个:在括号中间定义从哪个位置到选择位置的范围(起始位置为0.所以我有以下选项

list [0:3]显示[1,2,3],因为它从第一个数字的位置开始,并在第二个数字之前的位置结束

list [:3]显示与之前相同,第一个数字不存在,因此没有开始限制

list [5:]显示从第五个位置到结尾的列表[6,7,8,9]

现在,如果列表[x,y]中的x或y为负,则如果x位于x位置则为x,如果为y,则从len(list)-2位置结束 例如:list [-1:3] = [2,3]

现在你可以有2:像[x:y:z]这里x表示起始单元格,y表示最后一个单元格(不包括在返回的范围内)和z表示序列前进的步骤 列表[0:5:2] = [0,2,4]