Представьте, что это возможно:
arr3: List[Animal] = arr1
Теперь вы думаете, что у вас есть список животных, но на самом деле это список собак (обратите внимание, что arr3
не является копией arr1
, они тот же список ).
И поскольку вы думаете, что это список животных, вы можете добавить к нему Cat
.
Однако, поскольку это фактически список собак, вы не можете добавить к нему Cat
.В противном случае вы потерпите неудачу на AttributeError
после попытки использовать атрибут, специфичный для собаки.
В общем, список инвариантен - List[Animal]
нельзя назначить List[Dog]
(потому что он уже может содержать кошек) и List[Dog]
нельзя присвоить List[Animal]
(потому что вы можете добавить cat позже)
Это может быть неочевидно в Python, но вы можете сделать простой тест:
arr3: List[Animal] = arr1
arr3.append(Cat())
for dog in arr1:
print(dog.bark())
Mypy не позволяет этого, потому что это назначение может нарушить вашу логику кода