Tulis beberapa baris kode Python X
,, yang tidak merujuk variabel global apa pun, seperti itu
def method():
X
print(a)
method()
mencetak 1
tetapi
def method():
X
X
print(a)
method()
cetakan 2
.
Jadi, saya benci menjadi ngotot, tetapi sepertinya vars
dan locals
sebenarnya adalah variabel global dalam Python:
def test_global_1():
global vars, locals
vars = lambda: 2
locals = lambda: 3
def test_global_2():
print(vars())
print(locals())
test_global_1()
test_global_2()
Juga, sepertinya orang ingin melihat kriteria kemenangan yang objektif untuk teka-teki seperti ini. Panjang kode tidak terasa di sini, jadi mungkin kita bisa membuat sistem poin brownies untuk berbagai fitur baru kode? Saya tidak yakin persis apa ini tetapi di sinilah awalnya:
- +1 untuk benar-benar tanpa global (tidak
vars
ataulocals
) - +1 karena menjadi orang pertama yang memposting teknik tertentu
- +1 untuk solusi terpendek yang diposting
- +1 untuk solusi yang hanya melibatkan satu pernyataan Python
- +1 untuk "retasan" yang menarik seperti bergabung di lexical non-boundaries
- +1 karena tidak menggunakan pengecualian
Dan jika Anda dapat memikirkan lebih lanjut, Anda dapat mengedit pertanyaan ini untuk ditambahkan ke daftar.
Bisakah masalah ini diselesaikan tanpa menggunakan pengecualian dan tanpa menggunakan global seperti vars
dan locals
? Saya menduga itu bisa, meskipun saya belum tahu persis bagaimana ...
X
, tetapi ada opsi lain.Jawaban:
Menginisialisasi variabel
a
untuk0
hanya jika itu belum diinisialisasi dalam tabel variabel. Lalu, tambahkan itu.Lebih singkat (terima kasih kepada histokrat untuk
len
):Jika dua salinan
X
dapat berada di baris yang sama, kita bisa melakukannyayang berlipat ganda menjadi
dengan "domba kurban"
aa
memakan tugas variabel kedua.sumber
a=len(vars())+1
Python
Memikirkan solusi ini, karena
try
danexcept
merupakan cara pertama yang saya pikirkan untuk menentukan apakah suatu variabel sudah ada atau belum.sumber
Python 2
Pada dasarnya, ketika
exec
ditemui dalam Python 2, itu menyebabkan flag (0x01
) khusus untuk dihapusmethod.func_code.co_flags
, yang membuatlocals
tugas memiliki efek. Saya mengeksploitasi ini untuk mengimplementasikannonlocal
dukungan dalam Python 2 (lihat baris 43 untuk xor yang memodifikasi flag).sumber
a = locals().get('a', 0) + 1
?exec''
lagi;)Gagasan pertama saya (dan kemudian mengonsumsinya) adalah:
Tetapi jawaban histokrat tampaknya optimal.
sumber
Usaha saya. Menggunakan modul matematika untuk melacak jika X dijalankan sekali atau dua kali.
sumber
Diedit dalam menanggapi komentar: a adalah daftar daftar panjang kosong n, di mana n adalah jumlah waktu yang Anda panggil metode. Memanggil metode ini dua kali mencetak 1 kemudian 2.
sumber
a=[]
sebagai parameter berada di luar parameter untuk tantangan ini.The
try
cek blok jika variabel didefinisikan.Jika variabel tidak didefinisikan, (ini hanya ketika X-blok hadir sekali) maka
NameError
Pengecualian dinaikkan.Jika variabel didefinisikan, (ini adalah ketika X-blok hadir dua kali) maka
else
akan dimasukkan.sumber
else