<p>默认情况下,列表被视为始终是可变的。因此,如果您想表明某些列表永远不会更改,最好使用一些只读接口或协议(如<code>typing.Sequence</code>或<code>typing.Collection</code>)来明确表示</p>
<p>这两种类型的语义与相应的<a href="https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence" rel="nofollow noreferrer">collections.abc</a>类型相同。我想你可以把它们看作与C#的IReadOnlyCollection大致相同</p>
<pre class="lang-py prettyprint-override"><code>from typing import Sequence, overload
def foo(seq: Sequence[int]) -> None:
# This type checks
for item in seq:
print(seq)
# ...but this does not. Mypy reports a
# '"Sequence[int]" has no attribute "append" error', for example
seq.append(5)
# This type checks, since lists satisfy the Sequence protocol
foo([1, 2, 3, 4])
# Same thing with tuples
foo((1, 2, 3, 4))
class CustomSequence(Sequence[int]):
@overload
def __getitem__(self, i: int) -> int: ...
@overload
def __getitem__(self, s: slice) -> Sequence[int]: ...
def __getitem__(self, x: Union[int, slice]) -> Union[int, Sequence[int]]:
if isinstance(x, int):
return 1
else:
return [1, 2]
def __len__(self) -> int:
return 1
# Or any other kind of Sequence, actually.
foo(CustomSequence())
</code></pre>
<p>如果您想要一个通用的可变序列,请使用<code>MutableSequence</code>。请注意,列表同时满足Sequence和MutableSequence协议</p>