Guarda, chiariamo subito un concetto di base: su questo argomento ci sarebbe da parlarne per giorni e giorni.
Inoltre non stiamo parlando di definizioni rigorose e ci sono anche delle correnti di pensiero discordanti.
Poi mi sembra di capire che sei agli inizi e pertanto il tuo obbiettivo adesso e' quello di "sapere utilizzare" Python, anche senza capire completamente perche' quello che fai funziona e siccome non abbiamo e non vogliamo parlarne per giorni e giorni (ma si e' sempre liberi di farlo se si vuole), cerchero' di rispondere almeno alle due domande che hai posto.
se Python non e' intrinsicamente legato a OOP, perche' allora ogni elemento (lista, variabile, stringa) e' visto come un oggetto?
Ci sono 2 motivi, fondamentalmente.
1) Python e' un linguaggio interpretato e non compilato (anche questo non e' completamente vero). Quindi, quando lanci un programma in Python, l'interprete mette a disposizione una grossa infrastruttura di librerie e funzioni. Infatti sarebbe piu' corretto parlare di script in Python. Il vero programma e' Python stesso, il quale esegue il tuo script.
2) Il vero motivo, forse, e' piu' semplice. Si vuole che sia cosi'. Ovvero Python e' stato creato con l'idea di semplificare il piu' possibile la vita al programmatore, anche ai meno esperti. Un modo di fare cio' e' quello di fare in modo che ogni "oggetto" sia un... oggetto. Ovvero anche interi e array di interi sono creati come oggetti. Si vuole che sia cosi' e l'interprete mette a disposizione il marchingegno necessario.
Significa che sotto sotto Python e' orientato agli oggetti derivanti da classi predefinite anche quando non si programma creando classi, ecc?
L'idea e' quella che hai detto, ma cosi' come l'hai scritta non mi sembra proprio corretta.
Diciamo che con Python sei
costretto ad usare classi ed oggetti.
A esempio in Java hai ancora accesso ai cosiddetti 'basic types'. In C++ la cosa e' ancora piu' ambigua, siccome il C++ conserva ancora le caratteristiche del C.
Se posso fare un esempio un po' strano, prova a vedere i linguaggi non OOP come un supermercato dove puoi comprare gli alimenti di base e poi sei tu a cucinare i pasti. I linguaggi OOP assomigliano piu' a dei ristoranti, dove i piatti vengono serviti pronti e gli ingredienti base non sono accessibili. In un ristorante non puoi entrare e chiedere un bicchiere d'acqua, o almeno, nessuno lo fa, perche' non e' il posto adatto. In un ristorante servono anche l'acqua, ma e' un elemento del menu, e di solito viene servita e accompagnata da altri piatti molto elaborati.
Va beh, credo che sia sufficiente cosi, altrimenti c'e' il rischio che le idee si confondano solo di piu'.