Jadual Kandungan
Bagaimana yield perubahan fungsi tingkah laku
Skop berubah -ubah dan seumur hidup dalam penjana
Penutup dan yield : Berhati -hati untuk mengikat lewat
Pemadanan penjana dan __del__
Rumah pembangunan bahagian belakang tutorial php Implikasi skop penjana dan kata kunci `hasil`

Implikasi skop penjana dan kata kunci `hasil`

Jul 25, 2025 am 04:45 AM
PHP Variables Scope

Fungsi menggunakan hasil akan menjadi penjana, dan apabila dipanggil, mereka mengembalikan objek penjana dan bukannya dilaksanakan dengan segera; 2. Pembolehubah tempatan penjana tidak akan dimusnahkan semasa jeda hasil, tetapi akan diteruskan dengan bingkai penjana sehingga penjana habis atau ditutup; 3. Kitaran hayat berubah -ubah boleh menyebabkan peningkatan penggunaan memori, terutamanya apabila merujuk kepada objek besar; 4. Apabila digabungkan dengan penutupan, peraturan LEGB masih diikuti, tetapi masalah pengikatan akhir pembolehubah gelung perlu diselesaikan dengan segera mengikat (seperti nilai parameter lalai); 5. .Close () hendaklah dipanggil secara eksplisit untuk memastikan bahawa akhirnya menghalang pelaksanaan dilakukan untuk mengelakkan kelewatan dalam pembersihan sumber. Penjana mempengaruhi ingatan dan tingkah laku dengan memperluaskan masa survival pembolehubah, tetapi tidak mengubah peraturan skop leksikal.

Implikasi skop penjana dan kata kunci `hasil`

Apabila membincangkan implikasi skop penjana dan kata kunci yield dalam python, penting untuk memahami bagaimana yield mengubah fungsi menjadi objek penjana dan bagaimana skop berubah -ubah dalam konteks tersebut. Tidak seperti fungsi biasa, penjana mengekalkan keadaan antara panggilan, yang mempengaruhi bagaimana nama diselesaikan dan apabila pembolehubah dimusnahkan.

Implikasi skop penjana dan kata kunci `hasil`

Bagaimana yield perubahan fungsi tingkah laku

Apabila yield digunakan dalam fungsi, Python merawat berfungsi sebagai fungsi penjana . Memanggilnya tidak melaksanakan badan fungsi dengan segera; Sebaliknya, ia mengembalikan objek penjana yang boleh diulang.

 def my_generator ():
    x = 10
    hasil x
    x = 5
    hasil x

gen = my_generator ()
cetak (seterusnya (gen)) # 10
cetak (seterusnya (gen)) # 15

Di sini, x mengekalkan nilainya antara panggilan yield . Kegigihan ini mempunyai skop dan implikasi seumur hidup : Pembolehubah tempatan dalam fungsi penjana tidak dimusnahkan apabila fungsi "menjeda" pada yield . Mereka berterusan dalam bingkai penjana sehingga penjana habis atau sampah yang dikumpulkan.

Implikasi skop penjana dan kata kunci `hasil`

Skop berubah -ubah dan seumur hidup dalam penjana

Dalam fungsi biasa, pembolehubah tempatan dibuat apabila fungsi dipanggil dan dimusnahkan apabila ia kembali. Tetapi dalam penjana:

  • Pembolehubah tempatan berterusan merentasi titik yield .
  • Bingkai timbunan penjana tetap hidup selagi objek penjana wujud.
  • Pembolehubah hanya dibersihkan apabila penjana ditutup, keletihan, atau dipadam.

Pertimbangkan contoh ini:

Implikasi skop penjana dan kata kunci `hasil`
 kaunter def ():
    kiraan = 0
    Walaupun benar:
        kiraan hasil
        kiraan = 1

c = kaunter ()
cetak (seterusnya (c)) # 0
Cetak (seterusnya (c)) # 1

count pembolehubah hidup dalam skop penjana, walaupun fungsi itu kelihatan "berhenti sejenak." Ini berbeza dengan penutupan atau skop fungsi biasa - pelaksanaannya dengan skop tempatan yang dipelihara .

Ini boleh membawa kepada penggunaan memori yang lebih tinggi jika objek besar dirujuk dalam penjana, kerana mereka tidak akan dibebaskan sehingga penjana selesai.

Penutup dan yield : Berhati -hati untuk mengikat lewat

Penjana berinteraksi dengan penutupan dan melampirkan skop seperti fungsi lain, tetapi perkara masa. Kerana pelaksanaan ditangguhkan, isu mengikat lewat dapat terjadi:

 def create_generators ():
    Gens = []
    untuk saya dalam julat (3):
        Gens.Append ((lambda: (hasil i)) ())
    Kembali ke Gens

untuk g dalam create_generators ():
    cetak (seterusnya (g)) # semua cetak 2!

Tunggu - ini tidak berfungsi seperti yang diharapkan. Sebenarnya, menggunakan yield di dalam lambda adalah tidak sah (SyntaxError). Tetapi walaupun dalam fungsi penjana biasa, penutupan pembolehubah gelung boleh menjadi rumit:

 def make_generators ():
    penjana = []
    untuk saya dalam julat (3):
        def gen ():
            Hasil i
        penjana.append (gen ())
    Generator pulangan

untuk g dalam make_generators ():
    cetak (seterusnya (g)) # semua cetak 2

Isu di sini bukan dengan yield per se, tetapi dengan bagaimana penutupan menangkap i dengan rujukan. Kata kunci yield tidak mengubah peraturan scoping-penjana masih mengikuti peraturan LEGB (tempatan, melampirkan, global, terbina dalam) Python.

Untuk membetulkannya, mengikat pembolehubah awal:

 def gen_with_fixed_i (i):
    Hasil i

penjana = [gen_with_fixed_i (i) untuk i dalam julat (3)]

Pemadanan penjana dan __del__

Oleh kerana bingkai penjana memegang rujukan kepada pembolehubah tempatan, rujukan bulat dapat menghalang pembersihan tepat pada masanya. Python biasanya mengendalikan ini melalui koleksi sampah, tetapi ia adalah sesuatu yang perlu diperhatikan dalam aplikasi jangka panjang.

Anda boleh menutup penjana secara manual dengan .close() untuk mencetuskan pembersihan:

 def Resource_Generator ():
    Cetak ("Sumber Pembukaan")
    Cuba:
        menghasilkan "data"
    Akhirnya:
        Cetak ("Sumber Penutupan")

gen = sumber_generator ()
cetak (seterusnya (gen))
gen.close () # memastikan akhirnya blok berjalan

Tanpa .close() , blok finally mungkin tidak berjalan sehingga penjana adalah sampah yang dikumpulkan - tidak dapat diramalkan dalam cpython disebabkan oleh pengiraan rujukan, tetapi terutama risiko dalam pypy atau di bawah tekanan ingatan.


Oleh itu, sementara yield tidak mengubah peraturan scoping lexical, ia mengubah seumur hidup pembolehubah tempatan dan memperkenalkan kekayaan. Ini bermaksud:

  • Pembolehubah dalam fungsi penjana hidup lebih lama daripada fungsi biasa.
  • Penjana secara tidak sengaja boleh menyimpan objek besar dalam ingatan.
  • Tingkah laku penutupan masih mengikuti peraturan python standard - berhati -hati dengan mengikat lewat.
  • Sentiasa pertimbangkan pembersihan, terutamanya apabila menguruskan sumber.

Pada asasnya, penjana memanjangkan skop dalam masa , bukan dalam ruang nama - tetapi itu cukup untuk memberi kesan kepada memori dan tingkah laku dengan ketara.

Atas ialah kandungan terperinci Implikasi skop penjana dan kata kunci `hasil`. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Skop pembolehubah PHP dijelaskan
1 bulan yang lalu By 百草
Mengulas kod dalam php
4 minggu yang lalu By 百草
Petua untuk menulis komen php
4 minggu yang lalu By 百草

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1510
276
Skop Omnipresent: Panduan Praktikal untuk Superglobal PHP Skop Omnipresent: Panduan Praktikal untuk Superglobal PHP Jul 26, 2025 am 09:47 AM

Pembolehubah hyperglobal PHP sentiasa tersedia dengan susunan terbina dalam yang digunakan untuk memproses data permintaan, menguruskan keadaan dan mendapatkan maklumat pelayan; 1. Apabila menggunakan $ _get, parameter URL perlu ditukar dan disahkan jenis; 2. Apabila menerima data borang melalui $ _post, penapisan harus dilakukan dengan filter_input (); 3. Elakkan menggunakan $ _Request untuk mengelakkan kelemahan keselamatan; 4. $ _Session perlu memanggil session_start () dan log masuk untuk menetapkan semula ID sesi; 5. Apabila menetapkan $ _cookie, aktifkan atribut selamat, httponly dan samesite; 6. Maklumat dalam $ _server tidak boleh dipercayai sepenuhnya dan tidak boleh digunakan untuk pengesahan keselamatan; 7. $ _ env mungkin

Menavigasi Batasan: menyelam yang mendalam ke dalam skop tempatan dan global Menavigasi Batasan: menyelam yang mendalam ke dalam skop tempatan dan global Jul 26, 2025 am 09:38 AM

ThedifferencebetweenlocalandglobalscopeliesinwherevariablesaredeclaredAndAccessible: globalvariablesaredefinedoutsidefunctionsandaccessiblevery, whilelocalvariablaredeclaredinsidefunctionsandonlyeAccessoShoShem

Pesanan Resolusi Skop: Bagaimana PHP Mencari Pembolehubah Anda Pesanan Resolusi Skop: Bagaimana PHP Mencari Pembolehubah Anda Jul 25, 2025 pm 12:14 PM

PHPresolvesvariablesinaspecificorder:1.Localscopewithinthecurrentfunction,2.Functionparameters,3.Variablesimportedviauseinclosures,4.Globalscopeonlyifexplicitlydeclaredwithglobaloraccessedthrough$GLOBALS,5.Superglobalslike$_SESSIONand$_POSTwhichareal

Kata kunci `global`: pedang bermata dua dalam pengurusan skop php Kata kunci `global`: pedang bermata dua dalam pengurusan skop php Jul 25, 2025 pm 05:37 PM

TheglobalkeywordinPHPallowsfunctionstoaccessvariablesfromtheglobalscope,butitshouldbeusedsparinglyduetosignificantdrawbacks.1)Itenablesquickaccesstoconfigurationvaluesinsmallorlegacyscripts.2)ItfitsproceduralcodebaseslikeolderWordPresspluginswheredep

Implikasi skop penjana dan kata kunci `hasil` Implikasi skop penjana dan kata kunci `hasil` Jul 25, 2025 am 04:45 AM

Fungsi menggunakan hasil akan menjadi penjana, dan apabila dipanggil, mereka mengembalikan objek penjana dan bukannya dilaksanakan dengan segera; 2. Pembolehubah tempatan penjana tidak akan dimusnahkan semasa jeda hasil, tetapi akan terus wujud dengan bingkai penjana sehingga penjana habis atau ditutup; 3. Kitaran hayat berubah -ubah boleh menyebabkan peningkatan penggunaan memori, terutamanya apabila merujuk kepada objek besar; 4. Apabila digabungkan dengan penutupan, peraturan LEGB masih diikuti, tetapi masalah pembolehubah pembolehubah looping perlu diselesaikan dengan segera mengikat (seperti nilai parameter lalai); 5. .Close () hendaklah dipanggil secara eksplisit untuk memastikan bahawa akhirnya menghalang pelaksanaan dilakukan untuk mengelakkan kelewatan dalam pembersihan sumber. Penjana mempengaruhi ingatan dan tingkah laku dengan memperluaskan masa survival pembolehubah, tetapi tidak mengubah peraturan skop leksikal.

Demystifying Global Access: `Global` Kata kunci vs array` $ globals` Demystifying Global Access: `Global` Kata kunci vs array` $ globals` Jul 25, 2025 am 05:27 AM

Thetwomaintoolsforaccessingglobalvariablesinphparetheglobalkeywordshipthe $ globalsSuperglobalarray; 1) theglobalkeywordcreatesareencetoaglobalvariableinsideafunction, membenarkandirectaccessandmodification, andifevariableSundefined, itifevariabeSeTiesiseShies

Menguasai Scoping Lexical: Kata Kunci `Penggunaan` dan PHP Fungsi Tanpa Nama Menguasai Scoping Lexical: Kata Kunci `Penggunaan` dan PHP Fungsi Tanpa Nama Jul 25, 2025 am 11:05 AM

Dalam PHP, jika anda ingin menggunakan pembolehubah luaran dalam fungsi tanpa nama, anda mesti secara eksplisit mengimportnya melalui kata kunci penggunaan; 1. Penggunaan digunakan untuk memperkenalkan pembolehubah luaran ke dalam skop leksikal penutupan; 2. Lulus pembolehubah secara lalai dengan nilai, dan lulus mereka dengan rujukan dengan & $ var sintaks; 3. Pelbagai pembolehubah boleh diimport, dipisahkan oleh koma; 4. Nilai pembolehubah ditangkap apabila penutupan ditakrifkan, bukan apabila ia dilaksanakan; 5. Setiap lelaran dalam gelung mewujudkan salinan penutupan bebas untuk memastikan nilai pembolehubah ditangkap dengan betul; Oleh itu, penggunaan adalah mekanisme utama untuk mencapai interaksi antara penutupan dan persekitaran luaran, menjadikan kod lebih fleksibel dan dikawal.

Mengapa Pembolehubah Anda Hilang: Panduan Praktikal untuk Skop Teka -teki Mengapa Pembolehubah Anda Hilang: Panduan Praktikal untuk Skop Teka -teki Jul 24, 2025 pm 07:37 PM

Variablesdisappearduetoscoperules—wherethey’redeclareddetermineswheretheycanbeaccessed;2.Accidentalglobalcreationoccurswhenomittingvar/let/const,whilestrictmodepreventsthisbythrowingerrors;3.Blockscopeconfusionarisesbecausevarisfunction-scoped,unlike

See all articles