Pointer, String, dan (Kekekalan) dengan Python Oleh Danny D. Leybzon | Mei, 2022

Programming

[ad_1]
Halo Sahabat di suratpembaca.web.id. Kali ini kita akan membahas tentang Linux yakni Pointer, String, dan (Kekekalan) dengan Python Oleh Danny D. Leybzon | Mei, 2022

.

Semoga artikel mengenai Pointer, String, dan (Kekekalan) dengan Python Oleh Danny D. Leybzon | Mei, 2022

dapat memberikan faedah untuk Sahabat semua. Yuk baca artikel ini
sampai tuntas.

Kisah kinerja yang tidak mungkin dengan Python

Dari Unsplash

Baru-baru ini saya memiliki pengalaman lucu yang ternyata adalah pendidikan tinggi tentang variabilitas objek, terutama disiplin ilmu, dengan Python. Pengalaman itu adalah hasil dari mengganggu dua permainan asah otak Python, marah pada perbedaan yang tampak dalam fungsi bahasa, dan kemudian jatuh ke lubang kelinci yang menawan.

pertama asah otakDengan niat baik dari Mike Driscoll Di Twitter itu:

i = j = [3]i += jprint(i, j)

Apa yang akan menjadi output dari program?

Tampaknya sangat mudah. Variabel dan i Dan j Keduanya ditugaskan untuk merujuk ke daftar yang berisi angka 3. Selanjutnya, variabel i Mengoreksi dengan mengambil variabel di tempatnya j Telah ditambahkan ke dalamnya.

Untuk daftar, operator add-in di Python menambahkan konten baru dari daftar kedua ke konten di daftar pertama, jadi sekarang i == [3, 3]ketika j Itu masih [3] Karena tidak berubah, cetaklah ikan j Harus dicetak i ([3, 3]) Dan j ([3]). Oleh karena itu, jawaban akhirnya harus [3, 3], [3].

Orang yang terbiasa dengan cara mengimplementasikan variabel Python sebagai penanda akan mengenali kesalahan saya. i Dan j Keduanya menunjuk ke sebuah objek dalam memori, jadi meskipun i Itu adalah satu-satunya hal yang secara eksplisit dikoreksi, ketika objek dalam memori berubah, begitu pula nilainya j. Oleh karena itu, jawabannya benar [3, 3], [3, 3].

Belajar dengan baik jadi, ketika yang lain, terlihat sangat mirip, asah otak Dalam umpan berita saya (sekali lagi atas izin Mike Driscoll), saya pikir saya benar.

x = y = “Python”x += “rocks!”print(x, y)

Apa yang akan menjadi output dari program?

Kedengarannya hampir seperti masalah sebelumnya, bukan? Python mengimplementasikan string sebagai objek daftar, jadi menambahkan dua string cukup menambahkan string kedua ke akhir string pertama. Dengan demikian, x Harus dikonversi “Pythonrocks!”. Dan seperti yang saya pelajari dari permainan pikiran sebelumnya, sejak itu x Dan y Arahkan ke objek yang sama di memori, y Itu juga harus bermutasi “Pythonrocks!” Benar?

kesalahan! Setiap pecinta Python akan memberi tahu Anda bahwa string Python “tidak dapat diubah”, artinya tidak dapat diubah secara langsung. Sebagai gantinya, saat Anda mencoba mengubah string, Python membuat objek baru di memori berdasarkan lompatan yang ingin Anda lakukan ke objek utama. Jadi, sementara x Menjadi “Pythonrocks!”kan y istirahat “Python”Jadi mencetaknya bersama-sama memberi Anda “Pythonrocks!”, “Python”.

Bagus. Mengganggu, tapi cukup sederhana. Namun, dalam penelitian saya tentang variabilitas string dengan Python, saya menemukan contoh lain (untuk keterbacaan yang dimodifikasi, kali ini dari Austin Henley) Yang tampaknya bertentangan dengan apa yang baru saja saya pelajari:

a = “Hello”id(a)140214243255728a += “!”id(a)

Sekarang, karena kita baru saja mencoba mengubah string yang tidak dapat diubah, pasti ada objek baru di memori yang mengkodekan. “Hello!” Di tempat baru di memori jadi, panggil id Dari variabel a Alamat memori yang berbeda harus dicetak dari yang kita lihat sebelumnya, bukan?

Salah lagi! Dan yang ini benar-benar melemparkan saya untuk sebuah cincin. Saya dulu mencoba memproses kekekalan string, jadi sekarang setelah saya menyadari bahwa string itu tampaknya dapat diubah, saya kehilangan kepercayaan pada sifat komputasi yang pasti. Bagaimana ini dan contoh sebelumnya bisa benar? Bagaimana string bisa berubah dalam satu menit dan tidak berubah di menit berikutnya?

Pembaca yang sangat memperhatikan detail atau sangat ahli dalam Python mungkin melihat perbedaan antara contoh kedua dan ketiga. Pada contoh kedua, dua variabel menunjuk ke suatu objek dalam memori, sedangkan pada contoh ketiga, hanya satu variabel yang menunjuk ke suatu objek. Mengapa itu penting? Apa bedanya? Karena, seperti yang dijelaskan Austin Henley, “CPython itu pintar. Jika tidak ada referensi lain ke string, maka alih-alih menetapkan string baru, ia mencoba melompat string ”(penekanan ditambahkan). Dalam kasus dua permainan asah otak, keduanya x Dan y Menunjuk ke objek yang sama dalam memori, sehingga tetap tidak berubah.

Cerdas benar-benar atau hanya sangat membosankan. Karena, seperti yang dikatakan Henley, bahkan penjelasan ini agak sederhana. Jika mutasi pada string utama menjadi terlalu besar, CPython terkadang mengubah ukuran buffer, membuat objek baru di memori, sehingga mempertahankan gambar “tidak berubah”. Ketika dia menjalankan benchmark, dia memperhatikan bahwa mengubah ukuran buffer menyebabkan alamat di memori berubah 46 kali dari 10.000.

Dan teman saya, yang berdiskusi dengan saya tentang hal ini, berpendapat bahwa meskipun kita mengabaikan pengubahan ukuran buffer, bukankah perilaku ini berbahaya? Menelusuri apakah dua variabel keduanya menunjuk ke objek yang sama sepertinya merupakan beban mental yang tidak perlu bagi programmer.

Setelah berpikir lebih lama, kami menyadari bahwa meskipun aneh, tetapi perilaku ini sebenarnya tidak berbahaya. Bagaimanapun, pemrogram hanya dapat menghindari asumsi bahwa objek yang bermutasi mempertahankan alamatnya di memori. Jika dua atau lebih variabel menunjuk ke suatu objek, maka dijamin bahwa lompatan akan mengarah ke alamat baru untuk objek yang dirujuk oleh variabel yang dimodifikasi. Jika sejumlah variabel yang tidak diketahui menunjuk ke suatu objek, Anda dapat mengasumsikan bahwa objek tersebut menerima alamat baru di memori, tetapi jika “alamat baru” itu sama dengan alamat sebelumnya, tidak masalah.

Secara keseluruhan, ini adalah cara yang sangat sulit untuk menanamkan penggunaan pointer dalam di Python dan variabilitas dalam pikiran saya. Di sini kami berharap itu menempel.

Demikian materi tentang Pointer, String, dan (Kekekalan) dengan Python Oleh Danny D. Leybzon | Mei, 2022

, terimakasih sudah berkunjung di website saya, mudah-mudahan artikelnya ada manfaatnya ya.

[ad_2]

Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.