What does [:] mean?
It is an example of slice notation, and what it does depends on the type of population
. If population
is a list, this line will create a shallow copy of the list. For an object of type tuple
or a str
, it will do nothing (the line will do the same without [:]
), and for a (say) NumPy array, it will create a new view to the same data.
It might also help to know that a list slice in general makes a copy of part of the list. E.g. population[2:4]
will return a list containing population[2] and population[3] (slicing is right-exclusive). Leaving away the left and right index, as in population[:]
they default to 0 and length(population) respectively, thereby selecting the entire list. Hence this is a common idiom to make a copy of a list.
well... this really depends on the context. Ultimately, it passes a slice
object (slice(None,None,None)
) to one of the following methods: __getitem__
, __setitem__
or __delitem__
. (Actually, if the object has a __getslice__
, that will be used instead of __getitem__
, but that is now deprecated and shouldn't be used).
Objects can do what they want with the slice.
In the context of:
x = obj[:]
This will call obj.__getitem__
with the slice object passed in. In fact, this is completely equivalent to:
x = obj[slice(None,None,None)]
(although the former is probably more efficient because it doesn't have to look up the slice
constructor -- It's all done in bytecode).
For most objects, this is a way to create a shallow copy of a portion of the sequence.
Next:
x[:] = obj
Is a way to set the items (it calls __setitem__
) based on obj
.
and, I think you can probably guess what:
del x[:]
calls ;-).
You can also pass different slices:
x[1:4]
constructs slice(1,4,None)
x[::-1]
constructs slice(None,None,-1)
and so forth. Further reading: Explain Python's slice notation