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,
# 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
# filename test.py def test1(): def test2(): pass # return test2() # test1()
>>> 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)
>>> 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
def test3(): def test4(): pass return test4 # return test4()
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.