En Python, les paramètres sont passés selon le principe de 'call by object reference' (ou 'call by sharing'). Cela signifie que la fonction reçoit une référence à l'objet, et non l'objet lui-même. Si l'objet est mutable, il est possible de modifier son contenu à l'intérieur de la fonction, et ces modifications se refléteront sur la variable externe. Pour les objets immuables, comme les entiers ou les chaînes, une modification à l'intérieur de la fonction crée un nouvel objet, sans toucher à l'original.
Exemple pour un objet mutable :
def add_value(lst): lst.append(42) nums = [1, 2, 3] add_value(nums) print(nums) # [1, 2, 3, 42]
Pour un objet immuable :
def add_value(num): num += 10 x = 5 add_value(x) print(x) # 5
Question : "Les variables sont-elles passées par référence ou par valeur dans les fonctions Python ?"
Réponse : Ni l'un ni l'autre dans le sens classique. La variable transmet en réalité une référence à l'objet, mais pas la variable elle-même, et il n'est pas possible de remplacer l'objet externe.
Histoire Dans un des projets de parsing de données, la fonction utilisée pour filtrer une liste ne créait pas de nouvelle liste, la filtration étant réalisée par des modifications de la liste d'origine. Cela a conduit à la perte des données originales - après plusieurs exécutions du script, les données n'étaient plus présentes.
Histoire Un développeur junior pensait que les chaînes pouvaient être modifiées "par référence" à l'intérieur de la fonction, car d'autres paramètres (listes) pouvaient être modifiés. En conséquence, après l'appel de la fonction, le programme ne recevait pas les modifications attendues (la chaîne n'avait pas changé), ce qui causait des bugs incompréhensibles.
Histoire Dans une API REST pour filtrer les données d'entrée, le développeur a oublié de faire une copie du dictionnaire des paramètres, et lors de la validation, les valeurs étaient "perdues" - des paramètres étaient supprimés de l'objet original, ce qui cassait la logique des requêtes suivantes.