Saya mencoba menggunakan beberapa penugasan seperti yang ditunjukkan di bawah ini untuk menginisialisasi variabel, tapi saya bingung dengan perilaku, saya berharap untuk menetapkan kembali daftar nilai secara terpisah, maksud saya b [0] dan c [0] sama dengan 0 seperti sebelumnya.
a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)
Hasilnya adalah: [1, 3, 5] [1, 3, 5] [1, 3, 5]
Apakah itu benar? apa yang harus saya gunakan untuk banyak tugas? apa yang berbeda dari ini?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
hasil: ('f:', 3) ('e:', 4)
a
,b
danc,
semua titik dengan nilai yang sama (dalam hal ini daftar), atau Anda ingina=0
,b=3
danc=5
. Dalam hal ini, Anda inginkana,b,c = [0,3,5]
atau adila,b,c = 0,3,5
.Jawaban:
Jika Anda datang ke Python dari bahasa di C / Java / etc. keluarga, mungkin membantu Anda untuk berhenti memikirkan
a
sebagai "variabel", dan mulai memikirkannya sebagai "nama".a
,,b
danc
bukan variabel yang berbeda dengan nilai yang sama; mereka berbeda nama untuk nilai identik yang sama. Variabel memiliki tipe, identitas, alamat, dan segala macam hal seperti itu.Nama tidak memiliki semua itu. Nilai memang, tentu saja, dan Anda dapat memiliki banyak nama untuk nilai yang sama.
Jika Anda memberikan
Notorious B.I.G.
hot dog, *Biggie Smalls
danChris Wallace
miliki hot dog. Jika Anda mengubah elemen pertamaa
menjadi 1, elemen pertamab
danc
adalah 1.Jika Anda ingin tahu apakah dua nama memberi nama objek yang sama, gunakan
is
operator:Anda kemudian bertanya:
Di sini, Anda mengubah nama
e
menjadi nilai4
. Itu tidak memengaruhi namad
danf
dalam cara apa pun.Di versi Anda sebelumnya, Anda ditugaskan untuk
a[0]
, bukan kea
. Jadi, dari sudut pandanga[0]
, Anda memberontaka[0]
, tetapi dari sudut pandanga
, Anda mengubahnya di tempat.Anda dapat menggunakan
id
fungsi ini, yang memberi Anda beberapa nomor unik yang mewakili identitas suatu objek, untuk melihat secara tepat objek mana yang bahkan ketikais
tidak dapat membantu:Perhatikan bahwa
a[0]
telah berubah dari 4297261120 menjadi 4297261216 — sekarang nama untuk nilai yang berbeda. Danb[0]
sekarang juga menjadi nama untuk nilai baru yang sama. Itu karenaa
danb
masih menamai objek yang sama.Di bawah selimut,
a[0]=1
sebenarnya memanggil metode pada objek daftar. (Ini setara dengana.__setitem__(0, 1)
.) Jadi, itu tidak benar - benar memberontak sama sekali. Ini seperti meneleponmy_object.set_something(1)
. Tentu, kemungkinan objek tersebut memutihkan atribut instance untuk mengimplementasikan metode ini, tetapi bukan itu yang penting; Yang penting adalah Anda tidak menetapkan apa pun, Anda hanya memutasikan objek. Dan itu sama dengana[0]=1
.pengguna570826 bertanya:
Situasi yang persis sama dengan
a = b = c = [1, 2, 3]
: Anda memiliki tiga nama dengan nilai yang sama.Tetapi dalam kasus ini, nilainya adalah
int
, danint
s tidak berubah. Dalam kedua kasus tersebut, Anda dapat mengubah nilaia
ke nilai yang berbeda (misalnya,a = "Now I'm a string!"
), tetapi tidak akan memengaruhi nilai asli, yangb
danc
masih akan menjadi nama untuk. Perbedaannya adalah bahwa dengan daftar, Anda dapat mengubah nilainya[1, 2, 3]
menjadi[1, 2, 3, 4]
dengan melakukan, misalnyaa.append(4)
,; karena itu sebenarnya mengubah nilai yangb
danc
merupakan nama untuk,b
sekarang akan b[1, 2, 3, 4]
. Tidak ada cara untuk mengubah nilai10
menjadi hal lain.10
adalah 10 selamanya, sama seperti Claudia vampir adalah 5 selamanya (setidaknya sampai dia digantikan oleh Kirsten Dunst).* Peringatan: Jangan berikan hot dog Notorious BIG. Gangsta rap zombie tidak boleh diberi makan setelah tengah malam.
sumber
have, a = b = c = 10;
dan ketika kita mencoba memperbarui nilai b, apakah itu berpengaruh pada yang lain? meskipun saya memeriksa id mereka sama.10
tidak dapat diubah — itu berarti tidak ada cara untuk memperbarui nilai, jadi pertanyaan Anda tidak masuk akal. Anda dapat menunjukb
pada nilai yang berbeda, tetapi hal itu tidak berpengaruh padaa
danc
, yang masih menunjuk pada nilai aslinya. Perbedaan yang dibuat oleh daftar adalah bahwa mereka dapat diubah — misalnya, Anda dapatappend
ke daftar, ataulst[0] = 3
, dan yang akan memperbarui nilai, yang akan terlihat melalui semua nama untuk nilai itu.Uhuk uhuk
sumber
a,b,c = 1,2,3
tanpa tanda kurung bekerja di Python 2 atau 3, jika Anda benar-benar menginginkan tambahan cm kesesuaian.Ya, itulah perilaku yang diharapkan. a, b dan c semuanya ditetapkan sebagai label untuk daftar yang sama. Jika Anda ingin tiga daftar berbeda, Anda perlu menetapkannya secara individual. Anda bisa mengulang daftar eksplisit, atau menggunakan salah satu dari banyak cara untuk menyalin daftar:
Pernyataan penugasan dengan Python tidak menyalin objek - mereka mengikat nama ke objek, dan objek dapat memiliki label sebanyak yang Anda tetapkan. Di edit pertama Anda, mengubah [0], Anda memperbarui satu elemen dari daftar tunggal yang dirujuk oleh a, b, dan c. Di e kedua Anda, mengubah e, Anda beralih e menjadi label untuk objek yang berbeda (4 bukannya 3).
sumber
Dalam python, semuanya adalah objek, juga tipe variabel "sederhana" (int, float, dll.).
Ketika Anda mengubah nilai variabel, Anda benar-benar mengubah pointer itu , dan jika Anda membandingkan antara dua variabel itu membandingkan pointer mereka . (Agar jelas, pointer adalah alamat di memori komputer fisik tempat variabel disimpan).
Akibatnya, ketika Anda mengubah nilai variabel dalam, Anda mengubah nilainya di memori dan itu mempengaruhi semua variabel yang mengarah ke alamat ini.
Sebagai contoh Anda, ketika Anda melakukannya:
Ini berarti bahwa a dan b menunjuk ke alamat yang sama dalam memori yang berisi nilai 5, tetapi ketika Anda melakukannya:
Itu tidak mempengaruhi b karena a sekarang menunjuk ke lokasi memori lain yang berisi 6 dan b masih menunjuk ke alamat memori yang berisi 5.
Tapi, ketika Anda melakukannya:
a dan b, sekali lagi, menunjuk ke lokasi yang sama tetapi perbedaannya adalah jika Anda mengubah salah satu dari nilai daftar:
Ini mengubah nilai dari memori yang menunjuk pada a, tetapi a masih menunjuk ke alamat yang sama dengan b, dan sebagai hasilnya, b berubah juga.
sumber
PyObject
. Itu tidak benar dalam implementasi lain seperti PyPy atau Jython. (Faktanya, bahkan tidak jelas bagaimana itu bisa benar, karena bahasa-bahasa implementasi tersebut ditulis bahkan tidak memiliki petunjuk.)Anda dapat menggunakan
id(name)
untuk memeriksa apakah dua nama mewakili objek yang sama:Daftar bisa berubah; itu berarti Anda dapat mengubah nilai di tempatnya tanpa membuat objek baru. Namun, itu tergantung pada bagaimana Anda mengubah nilainya:
Jika Anda menetapkan daftar baru
a
, maka id akan berubah, sehingga tidak akan memengaruhib
danc
nilainya:Integer tidak dapat diubah, sehingga Anda tidak dapat mengubah nilai tanpa membuat objek baru:
sumber
id
belum tentu lokasi memori. Seperti yang dikatakan oleh dokumen , ini mengembalikan "identitas ... bilangan bulat ... yang dijamin unik dan konstan untuk objek ini selama masa pakainya." CPython kebetulan menggunakan alamat memori sebagaiid
, tetapi implementasi Python lainnya mungkin tidak. PyPy, misalnya, tidak. Dan mengatakan "dua vars menunjuk ke lokasi memori yang sama" menyesatkan siapa pun yang memahaminya C-style. "Dua nama untuk objek yang sama" keduanya lebih akurat dan tidak terlalu menyesatkan.dalam contoh pertama
a = b = c = [1, 2, 3]
Anda, Anda benar-benar mengatakan:Jika Anda ingin menetapkan 'a' sama dengan 1, 'b' sama dengan '2' dan 'c' sama dengan 3, coba ini:
Semoga ini membantu!
sumber
Sederhananya, dalam kasus pertama, Anda menetapkan beberapa nama ke a
list
. Hanya satu salinan daftar yang dibuat dalam memori dan semua nama merujuk ke lokasi itu. Jadi mengubah daftar menggunakan salah satu nama sebenarnya akan mengubah daftar dalam memori.Dalam kasus kedua, banyak salinan dengan nilai yang sama dibuat dalam memori. Jadi setiap salinan tidak tergantung satu sama lain.
sumber
Yang Anda butuhkan adalah ini:
sumber
Kode yang melakukan apa yang saya butuhkan adalah:
Hasil:
sumber