Effectivement, comme les arguments sont mis sur la pile,
dans le cas d'un type primitif, on place la valeur mais dans le cas d'un itérable, une référence j'imagine. Ce qui en soit fait sens (une liste de 10000 int sur la pile, ça fait mal)
Bref, certains langages font le choix de rendre le mode de passage de paramètre (valeur/ref) le plus implicite possible avec parfois des comportements moins prédictibles et d'autres le rendent explicite au prix de la lisibilité et d'une complexité accrue.
Tiens mois aussi j'ai envie de jouer:
package main
import (
"fmt"
)
func main() {
a := []int{1,2,3}
slice1 := a[:2]
slice2 := a[:2]
slice2 = append(slice2,4) // first append
slice2[0] = 8 // underlying array still the same, both slice 1 and slice 2 have element 0 == 8
fmt.Println("slice 1:", slice1) // slice 1: [8 2]
fmt.Println("slice 2:", slice2) // slice 2: [8 2 4]
slice2 = append(slice2,4) // array capacity now exceeded, new underlying array created
slice2[0] = 3 // slice1 still has element 0 == 8, but slice 2 has element 0 == 3
fmt.Println("slice 1:", slice1) // slice 1: [8 2]
fmt.Println("slice 2:", slice2) // slice 2: [3 2 4 4]
}
[^] # Re: Je hais le C++
Posté par El Titi . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2.
J'ai reproduit ton nouveau cas:
Effectivement, comme les arguments sont mis sur la pile,
dans le cas d'un type primitif, on place la valeur mais dans le cas d'un itérable, une référence j'imagine. Ce qui en soit fait sens (une liste de 10000 int sur la pile, ça fait mal)
Bref, certains langages font le choix de rendre le mode de passage de paramètre (valeur/ref) le plus implicite possible avec parfois des comportements moins prédictibles et d'autres le rendent explicite au prix de la lisibilité et d'une complexité accrue.
Tiens mois aussi j'ai envie de jouer:
package main