Dalam contoh, x is zreturn False. Tetapi jika x dan z diberi nilai yang sama, bukan daftar (misalnya x, z = 13, 13), maka akan x is zdikembalikan True. Mengapa demikian?
Tagihan
12
@Bill: Itu adalah artefak tentang bagaimana python menangani int. Python mengalokasikan objek integer ke mana xdan ztitik. Karena bilangan bulat kecil adalah kegagalan umum (-1 sebagai nilai kesalahan, 0 setiap kali Anda benar-benar mengindeks sesuatu, angka kecil biasanya merupakan nilai default yang wajar) Python mengoptimalkan dengan melakukan pra-alokasi bilangan kecil (-5 hingga 256) dan menggunakan kembali objek bilangan bulat yang sama. Jadi contoh Anda hanya berfungsi untuk angka dalam kisaran ini. Coba tetapkan sesuatu yang lebih besar, yaitu 270. Untuk info lebih lanjut lihat di sini
ted
1
@AndresR Tidak, itu salah. ismemeriksa apakah dua nama merujuk pada lokasi memori yang sama. Ini tidak ada hubungannya dengan objek itu sendiri. Sangat mudah untuk memiliki objek yang tidak dapat diubah seperti string yang sama tetapi tidak disimpan di lokasi yang sama, misalnya ''a'*10000 is 'a' * 10000False.
Jochen Ritzel
1
@JochenRitzel Anda benar sekali, terima kasih atas komentar ini! Jadi, saya tidak mengerti apa yang terjadi dengan "af" is "af"atau () is ()... mengapa mereka berbagi lokasi memori yang sama?
AndresR
2
@AndreasR Untuk string / angka literal dalam kode kompilator memeriksa bahwa mereka hanya ada sekali dan menggunakannya kembali. Nilai-nilai khusus seperti (), None, True, False dll juga didefinisikan sebagai lajang. Selama eksekusi, runtime juga mencoba menggunakan kembali angka dan string kecil, tetapi pada akhirnya itu adalah pertukaran antara kecepatan dan memori dan apa yang terjadi tergantung pada bagaimana runtime Python diimplementasikan.
Sementara dua solusi yang benar x is zdan id(x) == id(z)telah diposting, saya ingin menunjukkan detail implementasi python. Python menyimpan bilangan bulat sebagai objek, sebagai pengoptimalan, ia menghasilkan sekumpulan bilangan bulat kecil pada awalnya (-5 hingga 256) dan menunjukkan SETIAP variabel yang memegang bilangan bulat dengan nilai kecil ke objek yang sudah diinisialisasi ini. Info lebih lanjut
Ini berarti bahwa untuk objek integer yang diinisialisasi ke angka kecil yang sama (-5 hingga 256) memeriksa apakah dua objek sama akan mengembalikan true ( ON C-Pyhon , sejauh yang saya tahu ini adalah detail implementasi ), sedangkan untuk yang lebih besar angka ini hanya mengembalikan true jika satu objek diinisialisasi dari yang lain.
> i =13> j =13> i is j
True> a =280> b =280> a is b
False> a = b
> a
280> a is b
True
Catatan @ted tentang penggunaan id cukup relevan di sini.
Leo Ufimtsev
2
Saya sangat suka mendapatkan umpan balik visual, itulah mengapa saya terkadang hanya membuka http://www.pythontutor.com/visualize.html#mode=edit untuk melihat bagaimana memori dialokasikan dan apa yang mereferensikan apa.
Menambahkan gif yang luar biasa ini karena balasan ini adalah tentang visualisasi ..
Ini dari docs.python.org: "Setiap objek memiliki identitas, tipe, dan nilai. Identitas objek tidak pernah berubah setelah dibuat; Anda mungkin menganggapnya sebagai alamat objek dalam memori. Operator 'is' membandingkan identitas dua objek; fungsi id () mengembalikan integer yang mewakili identitasnya. "
Rupanya setiap kali Anda mengubah nilai, objek dibuat ulang seperti yang ditunjukkan oleh perubahan identitas. Garis x = 3 diikuti oleh garis x = 3.14 tidak memberikan kesalahan & memberikan identitas, jenis dan nilai yang berbeda untuk x.
Jawaban:
Itulah
is
untuk:x is y
mengembalikanTrue
jikax
dany
adalah objek yang sama.sumber
x is z
returnFalse
. Tetapi jika x dan z diberi nilai yang sama, bukan daftar (misalnyax, z = 13, 13
), maka akanx is z
dikembalikanTrue
. Mengapa demikian?x
danz
titik. Karena bilangan bulat kecil adalah kegagalan umum (-1 sebagai nilai kesalahan, 0 setiap kali Anda benar-benar mengindeks sesuatu, angka kecil biasanya merupakan nilai default yang wajar) Python mengoptimalkan dengan melakukan pra-alokasi bilangan kecil (-5 hingga 256) dan menggunakan kembali objek bilangan bulat yang sama. Jadi contoh Anda hanya berfungsi untuk angka dalam kisaran ini. Coba tetapkan sesuatu yang lebih besar, yaitu270
. Untuk info lebih lanjut lihat di siniis
memeriksa apakah dua nama merujuk pada lokasi memori yang sama. Ini tidak ada hubungannya dengan objek itu sendiri. Sangat mudah untuk memiliki objek yang tidak dapat diubah seperti string yang sama tetapi tidak disimpan di lokasi yang sama, misalnya''a'*10000 is 'a' * 10000
False."af" is "af"
atau() is ()
... mengapa mereka berbagi lokasi memori yang sama?y is x
akanTrue
,y is z
akan menjadiFalse
.sumber
Sementara dua solusi yang benar
x is z
danid(x) == id(z)
telah diposting, saya ingin menunjukkan detail implementasi python. Python menyimpan bilangan bulat sebagai objek, sebagai pengoptimalan, ia menghasilkan sekumpulan bilangan bulat kecil pada awalnya (-5 hingga 256) dan menunjukkan SETIAP variabel yang memegang bilangan bulat dengan nilai kecil ke objek yang sudah diinisialisasi ini. Info lebih lanjutIni berarti bahwa untuk objek integer yang diinisialisasi ke angka kecil yang sama (-5 hingga 256) memeriksa apakah dua objek sama akan mengembalikan true ( ON C-Pyhon , sejauh yang saya tahu ini adalah detail implementasi ), sedangkan untuk yang lebih besar angka ini hanya mengembalikan true jika satu objek diinisialisasi dari yang lain.
sumber
Anda juga dapat menggunakan id () untuk memeriksa objek unik mana yang dirujuk oleh setiap nama variabel.
sumber
Saya sangat suka mendapatkan umpan balik visual, itulah mengapa saya terkadang hanya membuka http://www.pythontutor.com/visualize.html#mode=edit untuk melihat bagaimana memori dialokasikan dan apa yang mereferensikan apa.
Menambahkan gif yang luar biasa ini karena balasan ini adalah tentang visualisasi ..
sumber
Ini dari docs.python.org: "Setiap objek memiliki identitas, tipe, dan nilai. Identitas objek tidak pernah berubah setelah dibuat; Anda mungkin menganggapnya sebagai alamat objek dalam memori. Operator 'is' membandingkan identitas dua objek; fungsi id () mengembalikan integer yang mewakili identitasnya. "
Rupanya setiap kali Anda mengubah nilai, objek dibuat ulang seperti yang ditunjukkan oleh perubahan identitas. Garis x = 3 diikuti oleh garis x = 3.14 tidak memberikan kesalahan & memberikan identitas, jenis dan nilai yang berbeda untuk x.
sumber