cari

Rumah  >  Soal Jawab  >  teks badan

python2.7 - Perintah pelaksanaan fungsi python atau kod kelas

Soalan telah diubah suai. Mari lihat Contoh 3 dahulu

Untuk pernyataan kawalan mudah,

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

Kita semua tahu bahawa apabila x > 0, pernyataan else tidak akan dilaksanakan,

Python ialah bahasa yang ditafsirkan untuk fungsi, contoh 1

# filename test.py

def test1():
    pass
    
# test1()

Berikut adalah pemahaman saya, saya tidak tahu sama ada betul atau tidak:

1. Untuk Java, jika baris kod test1() tidak melaksanakan panggilan ke fungsi test1, maka keseluruhan program pada dasarnya tidak bermakna, tidak akan ada peruntukan memori, dan tidak akan ada pelaksanaan

2 untuk python, objek fungsi test1 akan dibuat, dan kemudian satu siri operasi dalam test1 akan disimpan kerana program tidak berakhir dalam ingatan.
Adapun sebabnya, selepas program dijalankan, fungsi test1 akan menjadi atribut objek modul semasa, iaitu
. module __main__ 3 Bagi nama fungsi 'test1', ia merujuk kepada objek fungsi ini, jadi walaupun fungsi itu tidak dipanggil, mekanisme pengumpulan sampah tidak akan mengitar semulanya

Contoh fungsi bersarang 2

# filename test.py

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

Contoh 1, adakah pemahaman saya salah?

Apakah situasi ujian fungsi dalaman ujian1 dalam Contoh Perbandingan 2 Adakah terdapat sebarang perbezaan antara situasi dengan dan tanpa panggilan?

Masalah sebelum ini mungkin tidak diterangkan dengan jelas, ini contoh lagi 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)

Keluaran di atas ialah 2, yang boleh difahami, tetapi mengapa yang lain 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

Persoalannya sekarang adakah test4 fungsi dalam dalam test3 berada dalam ingatan? Jika ya, di mana? (Saya rasa ia harus ada dalam ingatan) Jika tidak, mengapa tiada ujian4? Jika tiada test4, apakah yang perlu saya lakukan jika saya mengubah suai kod di atas?

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

Apabila saya baru menyemak semula soalan itu, saya tiba-tiba terfikir bahawa ia mungkin tidak mempunyai sebarang kepentingan praktikal untuk pengaturcaraan Semua orang mungkin tahu cara mentakrif dan menggunakan fungsi dalaman. Tapi saya masih berharap ada yang boleh menjawab soalan saya
習慣沉默習慣沉默2729 hari yang lalu805

membalas semua(1)saya akan balas

  • PHP中文网

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

    Adalah disyorkan untuk membahagikan soalan ini kepada dua soalan berbeza pada masa hadapan.
    (1) Fungsi ini tidak dipanggil Python mempunyai strategi pengurusan memori yang lain, pengiraan rujukan: "Prinsip: Rekod bilangan kali objek dirujuk oleh objek lain. Apabila rujukan kepada objek ini dialih keluar, kiraan rujukan juga akan dikeluarkan. dikurangkan jika dikurangkan kepada 0, objek akan dilepaskan." Jadi saya rasa, ia sepatutnya dikitar semula semasa pengiraan rujukan.

    (2) Sama ada ia dipanggil bergantung pada sama ada rujukan objek telah dialih keluar dan sama ada terdapat kitaran rujukan Terdapat perbincangan serupa dalam urutan perbincangan e-mel di sini.

    balas
    0
  • Batalbalas