suchen

Heim  >  Fragen und Antworten  >  Hauptteil

python2.7 – Ausführungsreihenfolge der Python-Funktion oder des Klassencodes

Die Frage wurde geändert. Schauen wir uns zunächst Beispiel 3 an

Für einfache Steueranweisungen,

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

Wir alle wissen, dass die else-Anweisung nicht ausgeführt wird, wenn x >

Python ist eine interpretierte Sprache für Funktionen, Beispiel 1

# filename test.py

def test1():
    pass
    
# test1()

Das Folgende ist mein Verständnis, ich weiß nicht, ob es richtig ist oder nicht:

1. Wenn die Codezeile test1() den Aufruf der Funktion test1 nicht ausführt, ist das gesamte Programm grundsätzlich bedeutungslos, es findet keine Speicherzuweisung statt

2 Für Python wird ein Test1-Funktionsobjekt erstellt und dann eine Reihe von Vorgängen in Test1 gespeichert. Diese Vorgänge werden nicht ausgeführt. Auch wenn das gesamte Programm keine Aufrufe an Test1 durchführt, bleibt Test1 immer bestehen da das Programm nicht im Speicher endet.

Aus diesem Grund wird die Funktion test1 nach der Ausführung des Programms zum Attribut des aktuellen Modulobjekts, nämlich
.
3. Der Funktionsname „test1“ bezieht sich auf dieses Funktionsobjekt. Selbst wenn die Funktion nicht aufgerufen wird, wird sie vom Garbage-Collection-Mechanismus nicht recycelt module __main__ Verschachtelte Funktionsbeispiel 2

# filename test.py

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

Zum Beispiel 1: Ist mein Verständnis falsch?

Wie ist die Situation der inneren Funktion test2 von test1 in Vergleichsbeispiel 2? Gibt es einen Unterschied zwischen der Situation mit und ohne Aufruf?

Das vorherige Problem kann möglicherweise nicht klar beschrieben werden, hier ist ein weiteres Beispiel 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)

Die obige Ausgabe ist 2, was verständlich ist, aber warum ist die andere 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

Die Frage ist nun, ob die innere Funktion test4 in test3 im Speicher ist? Wenn ja, wo? (Ich denke, es sollte im Speicher sein) Wenn nicht, warum gibt es keinen Test4? Wenn es keinen Test4 gibt, was soll ich tun, wenn ich den obigen Code ändere?

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

Als ich die Frage gerade überarbeitet habe, dachte ich plötzlich, dass sie möglicherweise keine praktische Bedeutung für die Programmierung hat. Jeder weiß möglicherweise, wie man innere Funktionen definiert und verwendet. Aber ich hoffe trotzdem, dass jemand meine Frage beantworten kann

習慣沉默習慣沉默2729 Tage vor804

Antworte allen(1)Ich werde antworten

  • PHP中文网

    PHP中文网2017-06-12 09:27:49

    建議以後這問題拆成兩個不同問題。
    (1)没有调用该函数, Python還有另一個内存管理策略 reference counting:「原理: 记录一个对象被其他对象引用的次数. 当对这个对象的引用移除了, 引用计数也减小了. 要是减到0了, 这个对象也就被释放了」。所以我猜,應該是在reference counting 時已回收了。

    (2)有沒有調用就是看某個對象的引用是否移除了,還有是否有reference cycle,這裡的郵件討論串有一個類近的討論,不知道算不算回答了你這個問題。

    Antwort
    0
  • StornierenAntwort