Vyper arrays have a fixed size baked into their type, e.g. `uint256[5]`. This is a key difference from Solidity, where dynamic arrays are common; Vyper favours fixed sizes because they make gas costs and memory layout fully predictable.
scores: public(uint256[5])
@external
def set_score(i: uint256, value: uint256):
assert i < 5, "out of bounds"
self.scores[i] = valueOut-of-bounds indexing reverts automatically — you don't need to write your own bounds check, though doing so gives a clearer revert message.