python2.7 - Ordre d'exécution d'une fonction Python ou d'un code de classe
習慣沉默
習慣沉默 2017-06-12 09:25:49
0
1
793

La question a été modifiée. Regardons d’abord l’exemple 3

.

Pour les déclarations de contrôle simples,

x = 1
if x > 0:
    print('true')
else:
    print('false')

Nous savons tous que lorsque x > 0, l'instruction else ne sera pas exécutée,

Python est un langage interprété pour les fonctions, exemple 1

.
# filename test.py

def test1():
    pass
    
# test1()

Ce qui suit est ma compréhension, je ne sais pas si c'est correct ou non :

1. Pour Java, si la ligne de code test1() n'exécute pas l'appel à la fonction test1, alors le programme entier n'a fondamentalement aucun sens, il n'y aura pas d'allocation de mémoire et il n'y aura pas d'exécution. pour python, un objet fonction test1 sera créé, puis une série d'opérations dans test1 sera enregistrée. Ces opérations ne seront pas exécutées Même si l'ensemble du programme n'appelle pas test1, test1 existera toujours aussi longtemps. car le programme ne se termine pas en mémoire.
Quant à la raison, une fois le programme exécuté, la fonction test1 deviendra l'attribut de l'objet module actuel, qui est
. module __main__ 3. Quant au nom de la fonction « test1 », il fait référence à cet objet fonction, donc même si la fonction n'est pas appelée, le mécanisme de récupération de place ne la recyclera pas

Exemple de fonction imbriquée 2

# filename test.py

def test1():
    def test2():
        pass
    # return test2()
    
# test1()

Par exemple 1 : est-ce que ma compréhension est fausse ?

Quelle est la situation de la fonction interne test2 de test1 dans l'exemple comparatif 2 ? Y a-t-il une différence entre la situation avec et sans l'appel ?

Le problème précédent n'est peut-être pas décrit clairement, voici un autre exemple 3

>>> class A(object):
    a = []

    def test1(self):
        pass
    
    @classmethod
    def test2(cls):
        print('cls.a', sys.getrefcount(cls.a))
        print('cls.test1:', sys.getrefcount(cls.test1))

        
>>> A.test2()
('cls.a', 2)
('cls.test1:', 1)

La sortie ci-dessus est 2, ce qui est compréhensible, mais pourquoi l'autre est-elle 1 ?

>>> def test3():
    def test4():
        pass

    
>>> sys.getrefcount(test3)
2
>>> dir(test3)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']

# sys.getrefcount(test4)    NameError: name 'test4' is not defined

La question est maintenant de savoir si la fonction interne test4 dans test3 est en mémoire ? Si oui, où ? (Je pense que cela devrait être dans la mémoire) Sinon, pourquoi n'y a-t-il pas de test4 ? S'il n'y a pas de test4, que dois-je faire si je modifie le code ci-dessus ?

def test3():
    def test4():
        pass
    return test4   # return test4()

Lorsque je viens de réviser la question, j'ai soudain pensé qu'elle n'avait peut-être aucune signification pratique pour la programmation. Tout le monde sait peut-être comment définir et utiliser les fonctions internes. Mais j'espère quand même que quelqu'un pourra répondre à ma question
習慣沉默
習慣沉默

répondre à tous(1)
Ty80

Il est recommandé de diviser cette question en deux questions différentes à l'avenir.
(1) Cette fonction n'est pas appelée. Python a une autre stratégie de gestion de la mémoire, le comptage de références : "Principe : Enregistrer le nombre de fois qu'un objet est référencé par d'autres objets. Lorsque la référence à cet objet est supprimée, le décompte des références l'est également. réduit. S'il est réduit à 0, l'objet sera libéré." Donc je suppose qu'il aurait dû être recyclé lors du décompte des références.

(2) Le fait qu'il soit appelé dépend si la référence d'un objet a été supprimée et s'il existe un cycle de référence. Il y a une discussion similaire dans le fil de discussion par e-mail ici, je ne sais pas si elle répond à votre question.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal