Dokumentasi Python tampaknya tidak jelas tentang apakah parameter dilewatkan oleh referensi atau nilai, dan kode berikut menghasilkan nilai yang tidak berubah 'Asli'
class PassByReference:
def __init__(self):
self.variable = 'Original'
self.change(self.variable)
print(self.variable)
def change(self, var):
var = 'Changed'
Apakah ada sesuatu yang bisa saya lakukan untuk melewatkan variabel dengan referensi yang sebenarnya?
python
reference
parameter-passing
pass-by-reference
David Sykes
sumber
sumber
Jawaban:
Argumen disahkan oleh penugasan . Alasan di balik ini ada dua:
Begitu:
Jika Anda melewatkan objek yang dapat diubah ke dalam metode, metode tersebut mendapatkan referensi ke objek yang sama dan Anda dapat mengubahnya untuk kesenangan hati Anda, tetapi jika Anda mengubah referensi dalam metode tersebut, ruang lingkup luar tidak akan tahu apa-apa tentang hal itu, dan setelah itu Anda sudah selesai, referensi luar masih akan menunjuk ke objek asli.
Jika Anda meneruskan objek yang tidak dapat diubah ke suatu metode, Anda masih tidak dapat memutar ulang referensi luar, dan Anda bahkan tidak bisa bermutasi objek.
Untuk membuatnya lebih jelas, mari kita memiliki beberapa contoh.
Daftar - tipe yang bisa berubah
Mari kita coba memodifikasi daftar yang diteruskan ke metode:
Keluaran:
Karena parameter yang diteruskan adalah referensi
outer_list
, bukan salinannya, kita dapat menggunakan metode daftar mutasi untuk mengubahnya dan memiliki perubahan yang tercermin dalam lingkup luar.Sekarang mari kita lihat apa yang terjadi ketika kita mencoba mengubah referensi yang dilewatkan sebagai parameter:
Keluaran:
Karena
the_list
parameter dilewatkan oleh nilai, menetapkan daftar baru untuk itu tidak berpengaruh bahwa kode di luar metode dapat melihat. Ituthe_list
adalah salinanouter_list
referensi, dan kami memilikithe_list
menunjuk ke daftar baru, tetapi tidak ada cara untuk mengubah di manaouter_list
menunjuk.String - tipe yang tidak dapat diubah
Itu tidak berubah, jadi tidak ada yang bisa kita lakukan untuk mengubah isi string
Sekarang, mari kita coba untuk mengubah referensi
Keluaran:
Sekali lagi, karena
the_string
parameter dilewatkan oleh nilai, menetapkan string baru untuk itu tidak berpengaruh bahwa kode di luar metode bisa dilihat. Ituthe_string
adalah salinan dariouter_string
rujukan, dan kami telahthe_string
menunjuk ke string baru, tetapi tidak ada cara untuk mengubah ke mana rujukanouter_string
.Saya harap ini membersihkan sedikit.
EDIT: Telah dicatat bahwa ini tidak menjawab pertanyaan yang awalnya diajukan oleh David, "Apakah ada yang bisa saya lakukan untuk meneruskan variabel dengan referensi yang sebenarnya?". Mari kita kerjakan itu.
Bagaimana kita mengatasi ini?
Seperti yang ditunjukkan oleh jawaban Andrea, Anda dapat mengembalikan nilai baru. Ini tidak mengubah cara segala sesuatu dilewatkan, tetapi membiarkan Anda mendapatkan informasi yang Anda inginkan:
Jika Anda benar-benar ingin menghindari menggunakan nilai balik, Anda bisa membuat kelas untuk menyimpan nilai Anda dan meneruskannya ke fungsi atau menggunakan kelas yang ada, seperti daftar:
Meskipun ini agak rumit.
sumber
def Foo(alist): alist = [1,2,3]
akan mengubah isi daftar dari perspektif penelepon.Masalahnya berasal dari kesalahpahaman variabel apa yang ada di Python. Jika Anda terbiasa dengan sebagian besar bahasa tradisional, Anda memiliki model mental tentang apa yang terjadi dalam urutan berikut:
Anda yakin itu
a
adalah lokasi memori yang menyimpan nilai1
, kemudian diperbarui untuk menyimpan nilai2
. Bukan itu cara kerjanya dengan Python. Sebaliknya,a
dimulai sebagai referensi ke objek dengan nilai1
, kemudian akan dipindahkan sebagai referensi ke objek dengan nilai2
. Kedua objek tersebut dapat terus hidup berdampingan meskipuna
tidak mengacu pada yang pertama lagi; bahkan mereka dapat dibagikan dengan sejumlah referensi lain dalam program.Saat Anda memanggil fungsi dengan parameter, referensi baru dibuat yang merujuk ke objek yang diteruskan. Ini terpisah dari referensi yang digunakan dalam panggilan fungsi, jadi tidak ada cara untuk memperbarui referensi itu dan membuatnya merujuk ke objek baru. Dalam contoh Anda:
self.variable
adalah referensi ke objek string'Original'
. Ketika Anda menelepon,Change
Anda membuat referensi keduavar
ke objek. Di dalam fungsi Anda menetapkan kembali referensivar
ke objek string yang berbeda'Changed'
, tetapi referensiself.variable
tersebut terpisah dan tidak berubah.Satu-satunya cara untuk mengatasi ini adalah dengan melewatkan objek yang bisa berubah. Karena kedua referensi merujuk ke objek yang sama, setiap perubahan pada objek tercermin di kedua tempat.
sumber
Saya menemukan jawaban lain yang agak panjang dan rumit, jadi saya membuat diagram sederhana ini untuk menjelaskan cara Python memperlakukan variabel dan parameter.
sumber
B[0] = 2
, vs. penugasan langsungB = 2
,.A=B
atauB=A
.Ini bukan pass-by-value atau pass-by-reference - ini adalah call-by-object. Lihat ini, oleh Fredrik Lundh:
http://effbot.org/zone/call-by-object.htm
Berikut ini kutipan penting:
Dalam contoh Anda, ketika
Change
metode dipanggil - namespace dibuat untuk itu; danvar
menjadi nama, di dalam namespace itu, untuk objek string'Original'
. Objek itu kemudian memiliki nama dalam dua ruang nama. Selanjutnya,var = 'Changed'
mengikatvar
ke objek string baru, dan dengan demikian namespace metode lupa'Original'
. Akhirnya, namespace itu dilupakan, dan string'Changed'
bersamanya.sumber
swap
fungsi yang dapat bertukar dua referensi, seperti ini:a = [42] ; b = 'Hello'; swap(a, b) # Now a is 'Hello', b is [42]
Pikirkan hal-hal yang diteruskan oleh penugasan alih-alih dengan referensi / berdasarkan nilai. Dengan begitu, selalu jelas, apa yang terjadi selama Anda memahami apa yang terjadi selama penugasan biasa.
Jadi, ketika meneruskan daftar ke fungsi / metode, daftar tersebut ditugaskan ke nama parameter. Menambah daftar akan menghasilkan daftar yang dimodifikasi. Penugasan kembali daftar di dalam fungsi tidak akan mengubah daftar asli, karena:
Karena jenis abadi tidak dapat dimodifikasi, mereka tampak seperti sedang melewati nilai - melewati sebuah int ke fungsi sarana menempatkan int untuk parameter fungsi ini. Anda hanya bisa menetapkan ulang itu, tetapi itu tidak akan mengubah nilai variabel asli.
sumber
Effbot (alias Fredrik Lundh) telah menggambarkan gaya passing variabel Python sebagai call-by-object: http://effbot.org/zone/call-by-object.htm
Objek dialokasikan pada heap dan pointer ke mereka dapat diedarkan di mana saja.
Saat Anda membuat tugas seperti
x = 1000
, entri kamus dibuat yang memetakan string "x" di namespace saat ini ke pointer ke objek integer yang berisi seribu.Saat Anda memperbarui "x" dengan
x = 2000
, objek integer baru dibuat dan kamus diperbarui untuk menunjuk pada objek baru. Seribu objek lama tidak berubah (dan mungkin hidup atau tidak tergantung pada apakah benda lain merujuk pada objek tersebut).Ketika Anda melakukan tugas baru seperti
y = x
, entri kamus baru "y" dibuat yang menunjuk ke objek yang sama dengan entri untuk "x".Objek seperti string dan integer tidak dapat diubah . Ini berarti bahwa tidak ada metode yang dapat mengubah objek setelah dibuat. Misalnya, setelah objek integer seribu dibuat, itu tidak akan pernah berubah. Matematika dilakukan dengan membuat objek integer baru.
Objek seperti daftar bisa berubah . Ini berarti bahwa isi objek dapat diubah dengan apa pun yang menunjuk ke objek. Misalnya
x = []; y = x; x.append(10); print y
akan dicetak[10]
. Daftar kosong telah dibuat. Baik "x" dan "y" menunjuk ke daftar yang sama. The append metode bermutasi (update) obyek daftar (seperti menambahkan catatan ke database) dan hasilnya adalah terlihat baik "x" dan "y" (seperti update database akan terlihat untuk setiap koneksi ke database itu).Harapan yang menjelaskan masalah ini untuk Anda.
sumber
id()
fungsi mengembalikan nilai (referensi objek) pointer, seperti jawaban pepr menyarankan?Secara teknis, Python selalu menggunakan nilai referensi by pass . Saya akan mengulangi jawaban saya yang lain untuk mendukung pernyataan saya.
Python selalu menggunakan nilai pass-by-reference. Tidak ada pengecualian. Setiap penugasan variabel berarti menyalin nilai referensi. Tanpa pengecualian. Variabel apa pun adalah nama yang terikat pada nilai referensi. Selalu.
Anda dapat memikirkan nilai referensi sebagai alamat objek target. Alamat tersebut secara otomatis direferensikan saat digunakan. Dengan cara ini, bekerja dengan nilai referensi, sepertinya Anda bekerja secara langsung dengan objek target. Tapi selalu ada referensi di antaranya, satu langkah lagi untuk melompat ke sasaran.
Berikut adalah contoh yang membuktikan bahwa Python menggunakan passing dengan referensi:
Jika argumen diteruskan oleh nilai, bagian luar
lst
tidak dapat dimodifikasi. Hijau adalah objek target (hitam adalah nilai yang disimpan di dalam, merah adalah jenis objek), kuning adalah memori dengan nilai referensi di dalam - digambar sebagai panah. Panah solid biru adalah nilai referensi yang diteruskan ke fungsi (melalui jalur panah biru putus-putus). Kuning gelap jelek adalah kamus internal. (Ini sebenarnya bisa digambarkan juga sebagai elips hijau. Warna dan bentuknya hanya mengatakan itu internal.)Anda dapat menggunakan
id()
fungsi bawaan untuk mempelajari apa nilai referensi itu (yaitu, alamat objek target).Dalam bahasa yang dikompilasi, variabel adalah ruang memori yang mampu menangkap nilai tipe. Dalam Python, variabel adalah nama (diambil secara internal sebagai string) terikat ke variabel referensi yang menyimpan nilai referensi ke objek target. Nama variabel adalah kunci dalam kamus internal, bagian nilai dari item kamus menyimpan nilai referensi ke target.
Nilai referensi disembunyikan dalam Python. Tidak ada tipe pengguna eksplisit untuk menyimpan nilai referensi. Namun, Anda dapat menggunakan elemen daftar (atau elemen dalam jenis wadah lain yang cocok) sebagai variabel referensi, karena semua kontainer memang menyimpan elemen juga sebagai referensi ke objek target. Dengan kata lain, elemen sebenarnya tidak terkandung di dalam wadah - hanya referensi ke elemen.
sumber
Tidak ada variabel dalam Python
Kunci untuk memahami passing parameter adalah berhenti memikirkan "variabel". Ada nama dan objek dalam Python dan bersama-sama mereka muncul seperti variabel, tetapi berguna untuk selalu membedakan ketiganya.
Hanya itu yang ada untuk itu. Mutabilitas tidak relevan dengan pertanyaan ini.
Contoh:
Ini mengikat nama
a
ke objek tipe integer yang memegang nilai 1.Ini mengikat nama
b
ke objek yang sama dengan namax
yang terikat saat ini. Setelah itu, namab
itu tidak ada hubungannya dengan nama itux
lagi.Lihat bagian 3.1 dan 4.2 dalam referensi bahasa Python 3.
Cara membaca contoh di pertanyaan
Dalam kode yang ditunjukkan dalam pertanyaan, pernyataan
self.Change(self.variable)
mengikat namavar
(dalam lingkup fungsiChange
) ke objek yang menyimpan nilai'Original'
dan tugasvar = 'Changed'
(dalam tubuh fungsiChange
) menetapkan nama yang sama lagi: ke beberapa objek lain (yang terjadi untuk memegang string juga tetapi bisa menjadi sesuatu yang lain sama sekali).Cara melewati referensi
Jadi jika hal yang ingin Anda ubah adalah objek yang bisa berubah, tidak ada masalah, karena semuanya secara efektif dilewatkan oleh referensi.
Jika itu adalah objek yang tidak dapat diubah (misalnya bool, angka, string), cara untuk pergi adalah membungkusnya dengan objek yang bisa berubah.
Solusi cepat dan kotor untuk ini adalah daftar satu elemen (alih-alih
self.variable
, lulus[self.variable]
dan dalam fungsi modifikasivar[0]
).Pendekatan yang lebih pythonic adalah dengan memperkenalkan kelas satu atribut yang sepele. Fungsi menerima instance kelas dan memanipulasi atribut.
sumber
int
mendeklarasikan variabel, tetapiInteger
tidak. Keduanya mendeklarasikan variabel. TheInteger
variabel adalah obyek, yangint
variabel adalah primitif. Sebagai contoh, Anda menunjukkan bagaimana variabel Anda bekerja dengan menunjukkana = 1; b = a; a++ # doesn't modify b
. Itu persis benar di Python juga (menggunakan+= 1
karena tidak ada++
di Python)!Trik sederhana yang biasa saya gunakan adalah dengan membungkusnya dalam daftar:
(Ya saya tahu ini bisa merepotkan, tapi kadang-kadang cukup sederhana untuk melakukan ini.)
sumber
(sunting - Blair telah memperbarui jawabannya yang sangat populer sehingga kini akurat)
Saya pikir penting untuk dicatat bahwa posting saat ini dengan suara terbanyak (oleh Blair Conrad), meskipun benar sehubungan dengan hasilnya, menyesatkan dan garis batas tidak benar berdasarkan definisi. Meskipun ada banyak bahasa (seperti C) yang memungkinkan pengguna untuk melewati referensi atau lewat nilai, Python bukan salah satunya.
Jawaban David Cournapeau menunjuk ke jawaban yang sebenarnya dan menjelaskan mengapa perilaku di pos Blair Conrad tampaknya benar sedangkan definisi tidak.
Sejauh Python dinyatakan sebagai nilai, semua bahasa lulus nilai karena sebagian data (baik itu "nilai" atau "referensi") harus dikirim. Namun, itu tidak berarti bahwa Python dilewati oleh nilai dalam arti bahwa seorang programmer C akan memikirkannya.
Jika Anda menginginkan perilakunya, jawaban Blair Conrad baik-baik saja. Tetapi jika Anda ingin mengetahui mur dan baut mengapa Python tidak lulus nilai atau lulus referensi, baca jawaban David Cournapeau.
sumber
void swap(int& x, int& y) { int temp = x; x = y; y = temp; }
akan menukar variabel yang diteruskan ke sana. Di Pascal, Anda menggunakanvar
bukan&
.Anda mendapat jawaban yang sangat bagus di sini.
sumber
Dalam hal ini variabel yang berjudul
var
dalam metodeChange
ini diberikan referensiself.variable
, dan Anda segera menetapkan stringvar
. Tidak lagi menunjuk keself.variable
. Cuplikan kode berikut menunjukkan apa yang akan terjadi jika Anda memodifikasi struktur data yang ditunjukkan olehvar
danself.variable
, dalam hal ini daftar:Saya yakin orang lain bisa mengklarifikasi ini lebih lanjut.
sumber
Skema pass-by-assignment Python tidak persis sama dengan opsi parameter referensi C ++, tetapi ternyata sangat mirip dengan model passing-argumen dari bahasa C (dan lainnya) dalam praktiknya:
sumber
Seperti yang bisa Anda nyatakan, Anda perlu memiliki objek yang bisa berubah, tetapi izinkan saya menyarankan Anda untuk memeriksa variabel global karena mereka dapat membantu Anda atau bahkan memecahkan masalah seperti ini!
http://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
contoh:
sumber
Banyak wawasan dalam jawaban di sini, tetapi saya pikir poin tambahan tidak secara jelas disebutkan di sini secara eksplisit. Mengutip dari dokumentasi python https://docs.python.org/2/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
"Dalam Python, variabel yang hanya direferensikan di dalam suatu fungsi secara implisit bersifat global. Jika suatu variabel diberi nilai baru di mana saja di dalam tubuh fungsi, itu diasumsikan sebagai lokal. Jika suatu variabel pernah diberi nilai baru di dalam fungsi, variabelnya implisit lokal, dan Anda perlu secara eksplisit mendeklarasikannya sebagai 'global'. Meskipun sedikit mengejutkan pada awalnya, pertimbangan sesaat menjelaskan hal ini. Di satu sisi, memerlukan global untuk variabel-variabel yang ditugaskan menyediakan bilah terhadap efek samping yang tidak diinginkan. sebaliknya, jika global diperlukan untuk semua referensi global, Anda akan menggunakan global setiap saat. Anda harus mendeklarasikan sebagai global setiap referensi ke fungsi bawaan atau ke komponen modul yang diimpor. akan mengalahkan kegunaan deklarasi global untuk mengidentifikasi efek samping. "
Bahkan ketika meneruskan objek yang dapat diubah ke suatu fungsi, ini masih berlaku. Dan bagi saya jelas menjelaskan alasan perbedaan perilaku antara menetapkan ke objek dan beroperasi pada objek dalam fungsi.
memberi:
Oleh karena itu penugasan ke variabel global yang tidak dinyatakan global membuat objek lokal baru dan memutus tautan ke objek asli.
sumber
Inilah penjelasan sederhana (saya harap) dari konsep yang
pass by object
digunakan dalam Python.Setiap kali Anda melewati objek ke fungsi, objek itu sendiri dilewatkan (objek dengan Python sebenarnya yang Anda sebut nilai dalam bahasa pemrograman lain) bukan referensi ke objek ini. Dengan kata lain, saat Anda menelepon:
Objek aktual - [0, 1] (yang akan disebut nilai dalam bahasa pemrograman lain) sedang diteruskan. Jadi sebenarnya fungsi
change_me
akan mencoba melakukan sesuatu seperti:yang jelas tidak akan mengubah objek yang dilewatkan ke fungsi. Jika fungsinya tampak seperti ini:
Maka panggilan akan menghasilkan:
yang jelas akan mengubah objek. Jawaban ini menjelaskannya dengan baik.
sumber
list = [1, 2, 3]
penyebab menggunakan kembalilist
nama untuk sesuatu yang lain dan forgeting objek awalnya berlalu. Namun, Anda dapat mencobalist[:] = [1, 2, 3]
(omong-omonglist
adalah nama yang salah untuk variabel. Memikirkan[0, 1] = [1, 2, 3]
itu omong kosong. Pokoknya, menurut Anda apa artinya objek itu dilewatkan ? Apa yang disalin ke fungsi menurut pendapat Anda?[0, 1] = [1, 2, 3]
hanyalah contoh yang buruk. Tidak ada yang seperti itu di Python.alist[2]
dianggap sebagai nama elemen alist ketiga. Tapi saya pikir saya salah mengerti apa masalah Anda. :-)Selain semua penjelasan hebat tentang cara kerja hal ini dalam Python, saya tidak melihat saran sederhana untuk masalah ini. Saat Anda tampaknya membuat objek dan instance, cara pythonic menangani variabel instance dan mengubahnya adalah sebagai berikut:
Dalam metode instan, Anda biasanya merujuk
self
ke akses atribut instan. Adalah normal untuk mengatur atribut instance__init__
dan membaca atau mengubahnya dalam metode instance. Itu juga mengapa Anda memberikanself
argumen pertamadef Change
.Solusi lain adalah membuat metode statis seperti ini:
sumber
Ada sedikit trik untuk melewatkan objek dengan referensi, meskipun bahasa tidak memungkinkan. Ini berfungsi di Jawa juga, itu daftar dengan satu item. ;-)
Ini hack yang jelek, tapi berhasil. ;-P
sumber
p
adalah referensi ke objek daftar bisa berubah yang pada gilirannya menyimpan objekobj
. Referensi 'p', diteruskan kechangeRef
. Di dalamchangeRef
, referensi baru dibuat (referensi baru disebutref
) yang menunjuk ke objek daftar yang sama yangp
menunjuk. Tetapi karena daftar bisa berubah, perubahan daftar dapat dilihat oleh kedua referensi. Dalam hal ini, Anda menggunakanref
referensi untuk mengubah objek pada indeks 0 sehingga selanjutnya menyimpanPassByReference('Michael')
objek. Perubahan ke objek daftar dilakukan menggunakanref
tetapi perubahan ini terlihat olehp
.p
danref
arahkan ke daftar objek yang menyimpan objek tunggalPassByReference('Michael')
,. Jadi itup[0].name
kembaliMichael
. Tentu saja,ref
sekarang telah keluar dari ruang lingkup dan mungkin sampah yang dikumpulkan tetapi semuanya sama.name
, dariPassByReference
objek asli yang terkait dengan referensiobj
. Bahkanobj.name
akan kembaliPeter
. Komentar tersebut mengasumsikan definisi yangMark Ransom
diberikan.PassByReference
objek dengan objek lainPassByReference
di daftar Anda dan merujuk ke yang terakhir dari dua objek.Saya menggunakan metode berikut untuk dengan cepat mengkonversi beberapa kode Fortran ke Python. Benar, ini tidak lulus sebagai referensi ketika pertanyaan asli diajukan, tetapi merupakan pekerjaan sederhana dalam beberapa kasus.
sumber
dict
dan kemudian mengembalikandict
. Namun, saat membersihkannya mungkin diperlukan pembangunan kembali bagian dari sistem. Oleh karena itu, fungsi tidak hanya mengembalikan yang dibersihkandict
tetapi juga dapat memberi sinyal pembangunan kembali. Saya mencoba untuk melewatibool
referensi, tetapi ofc itu tidak berhasil. Mencari tahu bagaimana menyelesaikan ini, saya menemukan solusi Anda (pada dasarnya mengembalikan tuple) untuk bekerja dengan baik sementara juga tidak menjadi hack / solusi sama sekali (IMHO).Meskipun referensi lewat tidak ada yang cocok dengan python dan harus jarang digunakan ada beberapa solusi yang benar-benar dapat bekerja untuk mendapatkan objek yang saat ini ditugaskan ke variabel lokal atau bahkan menugaskan kembali variabel lokal dari dalam fungsi yang disebut.
Ide dasarnya adalah memiliki fungsi yang dapat melakukan akses itu dan dapat dilewatkan sebagai objek ke fungsi lain atau disimpan di kelas.
Salah satu caranya adalah dengan menggunakan
global
(untuk variabel global) ataunonlocal
(untuk variabel lokal dalam suatu fungsi) dalam fungsi wrapper.Gagasan yang sama berfungsi untuk membaca dan
del
membuat variabel.Untuk hanya membaca bahkan ada cara yang lebih singkat dari hanya menggunakan
lambda: x
yang mengembalikan callable yang ketika dipanggil mengembalikan nilai x saat ini. Ini agak seperti "panggilan dengan nama" yang digunakan dalam bahasa di masa lalu.Melewati 3 pembungkus untuk mengakses sebuah variabel agak sulit sehingga mereka dapat dibungkus ke dalam kelas yang memiliki atribut proxy:
Dukungan "pantulan" ular sanca memungkinkan untuk mendapatkan objek yang mampu menetapkan kembali nama / variabel dalam lingkup yang diberikan tanpa mendefinisikan fungsi secara eksplisit dalam lingkup itu:
Di sini
ByRef
kelas membungkus akses kamus. Jadi akses atributwrapped
diterjemahkan ke akses item dalam kamus yang dikirimkan. Dengan melewatkan hasil dari builtinlocals
dan nama variabel lokal ini akhirnya mengakses variabel lokal. Dokumentasi python pada 3.5 menyarankan bahwa mengubah kamus mungkin tidak berfungsi tetapi tampaknya bekerja untuk saya.sumber
mengingat cara python menangani nilai dan referensi padanya, satu-satunya cara Anda dapat mereferensikan atribut instance arbitrary adalah dengan nama:
dalam kode nyata Anda tentu saja akan menambahkan pengecekan error pada pencarian dict.
sumber
Karena kamus dilewatkan dengan referensi, Anda dapat menggunakan variabel dict untuk menyimpan nilai yang dirujuk di dalamnya.
sumber
Pass-By-Reference dalam Python sangat berbeda dari konsep pass by reference di C ++ / Java.
sumber
Karena contoh Anda berorientasi objek, Anda dapat membuat perubahan berikut untuk mencapai hasil yang serupa:
sumber
Anda hanya dapat menggunakan kelas kosong sebagai instance untuk menyimpan objek referensi karena atribut objek internal disimpan dalam kamus instance. Lihat contohnya.
sumber
Karena tampaknya tidak disebutkan pendekatan untuk mensimulasikan referensi seperti diketahui dari misalnya C ++ adalah dengan menggunakan fungsi "pembaruan" dan meneruskannya alih-alih variabel aktual (atau lebih tepatnya, "nama"):
Ini sebagian besar berguna untuk "referensi saja" atau dalam situasi dengan beberapa utas / proses (dengan membuat utas fungsi pembaruan / multiprosesing aman).
Jelas di atas tidak memungkinkan membaca nilai, hanya memperbaruinya.
sumber