Rozdíl je právě v tom, zda při operaci s rozdílnými typy dojde k vyvolání výjímky (silné typy) nebo o automatické konverzi (slabé typy). Python má silné typy, protože v Pythonu hodnoty svůj typ automaticky nemění (s jednou výjimkou u Python 2, konverze int/long). Python je silně typovaný i u uživatelských typů.
Žádná formální definice silného a slabého typování neexistuje, viz
https://en.wikipedia.org/wiki/Strong_and_weak_typing. Všude je to samé "colloquially", "generally", "may" a různé všelijak se překrývající definice různých autorů (koneckonců jednu jsi si tady navrhl i ty sám).
Mě přijde zajímavé
- jestli má jazyk statický typový systém (Java, Haskell, Python s MyPy) a jak je silný (třeba program v Rustu, pokud nepoužívá undefined, zaručuje absenci data races a neplatných přístupů do paměti)
- jestli má dynamický typový systém, tj. zda si s sebou nesou objekty informaci o svém typu za běhu, a do jaké míry (třeba v C se nedá hodnot za běhu ničeho doptat, v Pythonu mi každý objekt řekne, jakého je typu, v Javě mi může objekt říci, že je Array, ale už ne čeho protože type erasure atp.).
- někomu dalšímu mohou připadat důležité další vlastnosti ze seznamu na uvedené wikistránce
Pojmy silný a slabý typový systém používám skutečně zřídka a neformálně, když nehrozí nějaké zmatení, rozhodně bych se tím tady neoháněl jako něčím všeobecně uznávaným.
Ta "automatická změna typu" o které tu mluvíš není slabé typování, ale koerce (hledej coercion na
https://en.wikipedia.org/wiki/Type_conversion).