gila75 ha scritto: ↑martedì 5 aprile 2022, 17:55
Non so, peri ll momento potrei tralasciare, all'inizio ok approfondire, ma nemmeno impazzire.
La programmazione e' cosi', tempo al tempo.
Comunque anche il metodo insert concatena una stringa...mistero
sempre domandine complicate eh, @Gila?
Purtroppo, non sono all'altezza di dare una risposta esaustiva, speriamo nell'intervento dei maestri, ma, comunque, una tale risposta a mio parere passa per forza dalla considerazione che in python "tutto è un oggetto", e gli oggetti python hanno dei modi ben precisi per definire i loro
operatori, te ne faccio un esempio, supponiamo che io voglia farmi una classe per gestire i punti nello spazio e voglia implementare la somma di due punti 3d:
Codice: Seleziona tutto
from typing import Any
class Point3D:
def __init__(self, x: int, y: int, z: int) -> None:
self.x = x
self.y = y
self.z = z
def __add__(self, b: Any) -> Any:
x = self.x + b.x
y = self.y + b.y
z = self.z + b.z
return Point3D(x, y, z)
a = Point3D(1, 1, 0)
b = Point3D(1, 1, 1)
c = a + b
print(c.x, c.y, c.z)
2 2 1
scusa se ho utilizzato i
typehint, sto cercando di capirli in questo periodo, comunque l'esempio sopra è abbastanza semplice, ho definito un particolare metodo nella mia classe ("__add__") che stabilisce come "sommare" due istanze della stessa (N.B., avrei anche potuto definire la rappresentazione dell'oggetto come stringa con "__str__").
Riguardo al Tuo specifico quesito sulle concatenazioni una prima indicazione si potrebbe avere con gli
in-pace operators, che però dicono ben poco consultando l'help degli oggetti list
Codice: Seleziona tutto
| __iadd__(self, value, /)
| Implement self+=value.
Bisognerebbe andarsi a guardare i sorgenti (che probabilmente non sarei in grado di capire adeguatamente, dovrebbero essere in C) ma ho il sospetto che detta concatenazione in una lista funziona sugli oggetti iterabili, analogamente al metodo
Codice: Seleziona tutto
| extend(self, iterable, /)
| Extend list by appending elements from the iterable.
proviamo il Tuo esempio iniziale con entrambi i metodi:
Codice: Seleziona tutto
l = [1, 2, 3]
l += 'casa'
l
[1, 2, 3, 'c', 'a', 's', 'a']
l = [1, 2, 3]
l
[1, 2, 3]
l.extend('casa')
l
[1, 2, 3, 'c', 'a', 's', 'a']
l += (4, 5, 6)
l
[1, 2, 3, 'c', 'a', 's', 'a', 4, 5, 6]
l += (7, 8, 9)
l
[1, 2, 3, 'c', 'a', 's', 'a', 4, 5, 6, 7, 8, 9]
Come vedi il metodo "extend" e l'operatore "+=" danno lo stesso risultato e si comportano nello stesso modo anche utilizzando una tupla ... gli addendi "iterabili" credo che siano la risposta ai Tuoi quesiti.
[Edit] anzi, traducendomi la parte sugli in-place operators vedo che è proprio li la risposta lo dice chiaramente, quando parla di iadd :
For immutable targets such as strings, numbers, and tuples, the updated value is computed, but not assigned back to the input variable:
...
For mutable targets such as lists and dictionaries, the in-place method will perform the update, so no subsequent assignment is necessary: