Maison >développement back-end >Tutoriel Python >Affectation et copie Python

Affectation et copie Python

不言
不言original
2018-04-19 11:43:371321parcourir

Cet article partagera avec vous un article pour vous aider à comprendre les connaissances sur l'affectation et la copie en python. Les amis intéressés devraient y jeter un œil ensemble

Variables et affectation

En Python, tout est un objet, et les objets sont référencés via des « noms de variables ». Les « noms de variables » sont plus précisément appelés « noms ». nous utilisons Le nom fait référence à une personne et le code fait référence à un objet à travers le nom.

L'affectation de variable consiste à lier un nom à un objet. L'affectation ne copie pas l'objet. Tout comme nos parents nous donnent un nom à notre naissance, donner un surnom à quelqu'un ne crée pas une personne supplémentaire, cela crée simplement un nom supplémentaire.

Il existe deux façons de comparer deux objets, à savoir : is et == is compare si deux objets sont identiques. Le fait qu'il s'agisse du même objet peut être identifié par la valeur ID de l'objet ==. compare Il s'agit de savoir si les valeurs​​des deux objets sont égales

>>> x1 = [1,2]
>>> x2 = [1,2]
>>> x1 is x2
False
>>> id(x1)
4338854088
>>> id(x2)
4338904392
>>> x1 == x2
True

Bien que les valeurs​​de x1 et x2 soient les de même, ce sont deux objets indépendants et différents dans la mémoire, occupant des espaces mémoire différents, c'est comme deux pommes qui se ressemblent placées sur la table, mais qui sont en réalité deux objets différents.

>>> x3 = x2
>>> x3 is x2
True
>>> id(x3)
4338904392

Comme mentionné précédemment, l'affectation consiste à lier un nom à un objet. Ici, nous en lions simplement un nouveau à l'objet correspondant à x2. Le nom est x3, ce qui revient à mettre une pomme sur la table, en l'étiquetant initialement x2, puis en ajoutant ensuite une étiquette x3. C'est essentiellement la même pomme, donc x2 et x3 font référence à En fait, c'est le même objet.

Lorsque l'objet est modifié via x2, x3 changera également car il s'agit essentiellement du même objet. C'est comme lorsque Zhang San et Xiao Zhang sont la même personne, ajoutant. Les vêtements de Zhang San ajoutent en fait des vêtements à Xiao Zhang.

>>> x2.append(3)
>>> x2
[1, 2, 3]
>>> x3
[1, 2, 3]

Cependant, lorsque je réattribue une valeur à x2, cela signifie que x2 ne fait plus référence à l'objet précédent, mais fait référence au nouvel objet, et x3 fait toujours référence à l'objet précédent. Par exemple, une grosse pomme sur la table a deux étiquettes : x2 et x3. Réattribuer une valeur à x2 équivaut à attacher l'étiquette x2 à une autre pomme, mais x3 est toujours attaché à l'ancienne pomme.

>>> x2 = [3, 4]
>>> x3
[1, 2, 3]

Copie d'objet

Parfois, en entreprise, nous devons copier un objet, mais nous ne voulons pas avoir d'effets secondaires sur l'objet d'origine. Cela ne peut pas être résolu en l'attribuant à une nouvelle variable (car l'affectation ne copie pas l'objet), donc Python spécifiquement. fournit un mécanisme de copie basé sur l'objet d'origine. Créez rapidement un objet contenant la même valeur. Cette fonctionnalité est fournie par le module de copie.

La copie est divisée en copie superficielle et copie profonde.

>>> s = [1,2,3]>>> sc = copy.copy(s) # 浅拷贝>>> sc[1, 2, 3]
>>> sdc = copy.deepcopy(s) # 深拷贝
>>> sdc
[1, 2, 3]

Les objets copiés ont la même valeur mais sont en réalité des objets différents

>>> s == sc == sdc 
True
>>> s is sc 
False
>>> s is sdc
False

Alors, quelle est la différence entre une copie superficielle et une copie profonde ?

Pour les objets immuables, tels que les entiers, les chaînes, les tuples et les objets de collection composés de ces objets immuables, il n'y a aucune différence entre la copie superficielle et la copie profonde. Ils copient tous les deux un nouvel objet

. La différence entre les deux est que lors de la copie d'un objet combiné, tel qu'une liste dans une liste, ou un dictionnaire ou une liste dans un dictionnaire, la copie superficielle copie uniquement la coque externe et les éléments à l'intérieur ne sont pas copiés, tandis que la copie profonde copie fait une nouvelle copie du shell et des éléments à l'intérieur.

Regardons un exemple :

>>> x = [2, 3]
>>> y = [7, 11]
>>> z = [x, y]
>>> a = copy.copy(z) # 浅拷贝
>>> a[0] is z[0]
True

La référence d'élément dans l'objet copié a est x et y Lorsque vous modifiez la valeur de x, a changera également.

>>> b = copy.deepcopy(z) # 深拷贝
>>> b[0] is z[0]
False

Pour une copie approfondie, les éléments à l'intérieur sont également copiés à nouveau, et une copie est faite avec x Pour deux éléments de même valeur que y, modifier les valeurs de x et y n'affectera pas b

Copiez la tranche de la liste z[:] ou appelez la méthode de copie list.copy() du objet. C’est une copie superficielle. Pour les objets personnalisés, nous pouvons également implémenter nous-mêmes la méthode __copy__ et la méthode __deepcopy__

Recommandations associées :

Analyse du rôle des virgules après les instructions d'affectation Python

Partage des méthodes d'opération d'affectation Python


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn