[:]做什么?

Ric*_*nop 9 python

return self.var[:]
Run Code Online (Sandbox Code Playgroud)

这会带来什么回报?

Kat*_*iel 9

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

foo = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

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

foo[1:4]
Run Code Online (Sandbox Code Playgroud)

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

foo[1:] == [2,3,4,5]
foo[:4] == [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

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

>>> 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]
Run Code Online (Sandbox Code Playgroud)

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

顺便说一下,切片有一个可选的第三个参数,它是一个步骤参数 - 它允许你在大于1的跳转中移动列表.所以你可以写范围(100)[0 :: 2]所有偶数高达100.


Fré*_*idi 5

如果self.var可变序列,它将返回该序列的浅表副本.

如果self.var是不可变的内置序列,例如a string或a tuple,则大多数实现将返回self.var自身.