Passage par valeur, passage par variable

Objectifs

  • Connaître la notion de passage par valeur et de passage par référence ;

  • Connaître le comportement en JavaScript et en Python.

Mise en situation

Selon comment un paramètre est passé à une fonction, le potentiel traitement de la fonction pourra avoir une incidence ou non sur la variable d'origine. En effet, si la variable passée en paramètre est copiée, toute modification effectuée par la fonction ne sera pas répercutée sur la variable d'origine. Et inversement si il s'agit d'une référence.

Il est important de bien maîtriser ces aspects lorsque l'on utilise des fonctions, car les deux comportements sont susceptibles de mener à des résultats très différents dans l'exécution du programme.

DéfinitionPassage par valeur

Le passage d'un paramètre par valeur copie la valeur du paramètre dans une variable locale à la fonction.

Ainsi, si l'argument est modifié, le paramètre passé à la fonction ne l'est pas.

Fondamental

Le passage des types primitifs en Python et en JavaScript s'apparente à un passage par valeur.

ExemplePassage par valeur en Python

Voici un exemple de passage par valeur en Python.

1
def doubleBankAccount(amount):
2
  amount = amount * 2
3
4
bankAccountAmount = 777
5
doubleBankAccount(bankAccountAmount)
6
print(bankAccountAmount)
1
777

Ici les valeurs ayant un type primitif ne sont pas modifiées suite à l'appel de la fonction.

ExemplePassage par valeur en JavaScript

On obtient le même comportement en JavaScript.

1
function doubleBankAccount (amount) {
2
  amount = amount * 2
3
}
4
let bankAccountAmount = 777
5
doubleBankAccount(bankAccountAmount)
6
console.log(bankAccountAmount)
7
1
777

DéfinitionPassage par référence

Le passage d'un paramètre par référence copie la référence du paramètre dans un argument qui une variable locale à l'étendue de la fonction.

Ainsi, si l'argument est modifié, le paramètre passé à la fonction l'est aussi.

Fondamental

Le passage des types composés en Python et en JavaScript s'apparente à un passage par référence.

ExemplePassage par référence en JavaScript

Voici un exemple de passage par référence en JavaScript.

1
function addSpecialNumber(numbers) {
2
  numbers.push(23)
3
}
4
let lottoNumbers = [32, 41, 130]
5
addSpecialNumber(lottoNumbers)
6
console.log(lottoNumbers)
1
[32, 41, 130, 23]

Ici lottoNumber, étant associé à une valeur d'un type composé est modifiée suite à l'appel de la fonction.

ExemplePassage par référence en Python

On obtient le même comportement en Python.

1
def addSpecialNumber(numbers):
2
  numbers.append(23)
3
4
lottoNumber = [32, 41, 130]
5
addSpecialNumber(lottoNumber)
6
print(lottoNumber)
1
[32, 41, 130, 23]

ComplémentPassage par assignation

En Python, le passage des arguments se fait plus exactement par affectation : l'affectation ne fait que créer des références aux objets et il n'y a pas d'alias entre le nom d'un argument dans l'étendue appelante et l'étendue appelée. Ainsi il n'y a donc pas d'appel par référence en soi.

Voir l'élément de documentation ici : https://docs.python.org/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference

À retenir

Un passage par valeur copie la valeur dans une variable de l'étendue d'une fonction. Un passage par référence copie la référence dans une variable de l'étendu d'une fonction.

En JavaScript et en Python, le passage par valeur s'applique sur les types primitifs, le passage par référence s'appliquer sur les types composés.