Pemahaman saya adalah bahwa string Python tidak dapat diubah.
Saya mencoba kode berikut:
a = "Dog"
b = "eats"
c = "treats"
print a, b, c
# Dog eats treats
print a + " " + b + " " + c
# Dog eats treats
print a
# Dog
a = a + " " + b + " " + c
print a
# Dog eats treats
# !!!
Bukankah seharusnya Python mencegah penugasan? Saya mungkin melewatkan sesuatu.
Ada ide?
python
string
immutability
mutability
jason
sumber
sumber
id()
fungsinya.a
akan memiliki id yang berbeda sebelum dan sesudah tugas, yang menunjukkan bahwa itu menunjuk ke objek yang berbeda. Begitu juga dengan kode sepertib = a
Anda akan menemukannyaa
danb
akan memiliki id yang sama, menandakan mereka mereferensikan objek yang sama.Jawaban:
Pertama
a
menunjuk ke string "Anjing". Kemudian Anda mengubah variabela
untuk menunjuk ke string baru "Dog eats treats". Anda tidak benar-benar mengubah string "Anjing". String tidak dapat diubah, variabel dapat mengarah ke apa pun yang diinginkan.sumber
Objek string itu sendiri tidak dapat diubah.
Variabel,
a
yang menunjuk ke string, bisa berubah.Mempertimbangkan:
sumber
a.append(3)
tidak sama dengana = a + 3
. Ini bahkan tidaka += 3
(penambahan di tempat sama dengan.extend
, bukan dengan.append
).+
berperilaku sama untuk daftar dan string - ini digabungkan dengan membuat salinan baru dan tidak mengubah operan mana pun.append
fungsi karena tidak dapat diubah.Variabel a menunjuk ke objek "Anjing". Yang terbaik adalah memikirkan variabel dengan Python sebagai tag. Anda dapat memindahkan tag untuk objek yang berbeda yang adalah apa yang Anda lakukan ketika Anda berubah
a = "dog"
kea = "dog eats treats"
.Namun, kekekalan mengacu pada objek, bukan tag.
Jika Anda mencoba
a[1] = 'z'
untuk membuat"dog"
menjadi"dzg"
, Anda akan mendapatkan error:karena string tidak mendukung penugasan item, sehingga string tidak dapat diubah.
sumber
Sesuatu bisa berubah hanya jika kita dapat mengubah nilai yang disimpan di lokasi memori tanpa mengubah lokasi memori itu sendiri.
Triknya adalah: Jika Anda menemukan bahwa lokasi memori sebelum dan sesudah perubahan sama, itu bisa berubah.
Misalnya, daftar bisa berubah. Bagaimana?
Sebuah string tidak bisa diubah. Bagaimana kita membuktikannya?
kita mendapatkan
Jadi kami gagal memutasi string. Artinya string tidak bisa diubah.
Saat Anda menetapkan ulang, Anda mengubah variabel untuk menunjuk ke lokasi baru itu sendiri. Di sini Anda tidak melakukan mutasi string, tetapi mutasi variabel itu sendiri. Berikut ini adalah apa yang Anda lakukan.
id
sebelum dan sesudah penugasan ulang berbeda, jadi ini membuktikan bahwa Anda sebenarnya tidak bermutasi, tetapi mengarahkan variabel ke lokasi baru. Yang tidak memutasi string itu, tetapi memutasi variabel itu.sumber
Variabel hanyalah label yang menunjuk ke suatu objek. Objek tidak dapat diubah, tetapi Anda dapat membuat label mengarah ke objek yang sama sekali berbeda jika Anda mau.
sumber
Mempertimbangkan:
Perhatikan bahwa lokasi memori hex tidak berubah ketika saya menyimpan nilai yang sama dalam variabel dua kali. Itu berubah ketika saya menyimpan nilai yang berbeda. String itu tidak bisa diubah. Bukan karena fanatisme, tetapi karena Anda membayar hukuman kinerja karena membuat objek baru dalam ingatan. Variabel
a
hanyalah label yang menunjuk ke alamat memori itu. Itu bisa diubah untuk menunjuk ke apapun.sumber
Pernyataan tersebut
a = a + " " + b + " " + c
dapat dipecah berdasarkan petunjuk.a + " "
mengatakan beri sayaa
poin apa , yang tidak dapat diubah, dan tambahkan" "
ke set kerja saya saat ini.Penyimpanan:
+ b
mengatakan beri sayab
poin apa , yang tidak dapat diubah, dan tambahkan ke set kerja saat ini.Penyimpanan:
+ " " + c
mengatakan tambahkan" "
ke set saat ini. Lalu beri sayac
poin apa , yang tidak dapat diubah, dan tambahkan ke set kerja saat ini. Penyimpanan:Akhirnya,
a =
kata set pointer saya untuk menunjuk ke set yang dihasilkan.Penyimpanan:
"Dog"
direklamasi, karena tidak ada lagi pointer yang terhubung ke potongan memorinya. Kami tidak pernah mengubah bagian memori yang"Dog"
berada, yang dimaksud dengan tidak dapat diubah. Namun, kita dapat mengubah label mana, jika ada, yang mengarah ke bagian memori tersebut.sumber
sumber
Ada perbedaan antara data dan label yang dikaitkan dengannya. Misalnya saat Anda melakukannya
data
"dog"
dibuat dan diletakkan di bawah labela
. Label bisa berubah tapi apa yang ada di memori tidak. Data"dog"
akan tetap ada di memori (sampai pengumpul sampah menghapusnya) setelah Anda melakukannyaDalam program Anda
a
sekarang ^ menunjuk ke ^"cat"
tetapi stringnya"dog"
tidak berubah.sumber
String Python tidak dapat diubah. Namun,
a
ini bukan string: ini adalah variabel dengan nilai string. Anda tidak dapat mengubah string, tetapi dapat mengubah nilai variabel menjadi string baru.sumber
Variabel dapat mengarah ke mana saja yang mereka inginkan .. Kesalahan akan muncul jika Anda melakukan hal berikut:
sumber
Objek string Python tidak dapat diubah. Contoh:
Dalam contoh ini kita dapat melihat bahwa ketika kita menetapkan nilai yang berbeda dalam sebuah objek, objek baru dibuat.
Dan itu tidak bisa dimodifikasi. Contoh:
Terjadi kesalahan.
sumber
'mutable' berarti kita dapat mengubah konten string, 'immutable' berarti kita tidak dapat menambahkan string tambahan.
sumber
>>> a = 'dogs'
>>> a.replace('dogs', 'dogs eat treats')
'dogs eat treats'
>>> print a
'dogs'
Tidak bisa diubah, bukan ?!
Bagian perubahan variabel telah dibahas.
sumber
replace()
metode tersebut mengembalikan string baru.Pertimbangkan tambahan ini untuk contoh Anda
Salah satu penjelasan lebih tepat yang saya temukan di blog adalah:
Tautan ke blog: https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/
sumber
Menambahkan sedikit lebih banyak pada jawaban yang disebutkan di atas.
id
variabel berubah setelah penugasan ulang.Artinya kita telah mengubah variabel
a
untuk menunjuk ke string baru. Sekarang ada dua objekstring
(str):'initial_string'
denganid
= 139982120425648dan
'new_string'
denganid
= 139982120425776Perhatikan kode di bawah ini:
Sekarang,
b
tunjuk ke'initial_string'
dan memiliki yang samaid
sepertia
sebelumnya.Jadi,
'intial_string'
belum bermutasi.sumber
Meringkas:
Tidak tetap:
Kekal:
Ini adalah kesalahan dalam Python 3 karena tidak dapat diubah. Dan bukan kesalahan di Python 2 karena jelas itu tidak bisa diubah.
sumber
Fungsi
id()
bawaan mengembalikan identitas objek sebagai integer. Bilangan bulat ini biasanya sesuai dengan lokasi objek di memori.Awalnya, 'a' disimpan di lokasi memori 139831803293008, karena objek string tidak dapat diubah dalam python jika Anda mencoba mengubah dan menetapkan ulang referensi akan dihapus dan akan menjadi penunjuk ke lokasi memori baru (139831803293120).
sumber
sumber
Gambar ini memberikan jawabannya. Mohon dibaca.
sumber
Kami baru saja menggabungkan dua nilai string. Kami tidak pernah mengubah nilai (a). Sekarang (a) mewakili blok memori lain yang memiliki nilai "dogdog". Karena di backend, satu variabel tidak pernah merepresentasikan dua blok memori pada waktu yang bersamaan. Nilai (a) sebelum penggabungan adalah "anjing". Tapi setelah itu (a) mewakili "dogdog", karena sekarang (a) di rep backend. blok yang memiliki nilai "dogdog". Dan "anjing" adalah rep. oleh (b) dan "anjing" tidak dihitung sebagai nilai sampah sampai (b) mewakili "anjing".
Kebingungannya adalah kita merepresentasikan blok memori (yang berisi data atau info.) Di backend dengan nama variabel yang sama.
sumber
Anda dapat membuat array numpy tidak dapat diubah dan menggunakan elemen pertama:
kemudian:
atau
sumber