Bagaimana saya bisa berkeliling mendeklarasikan variabel yang tidak digunakan dalam perulangan for?

88

Jika saya memiliki pemahaman daftar (misalnya) seperti ini:

['' for x in myList]

Secara efektif membuat daftar baru yang memiliki string kosong untuk setiap elemen dalam daftar, saya tidak pernah menggunakan x. Apakah ada cara yang lebih bersih untuk menulis ini sehingga saya tidak perlu mendeklarasikan xvariabel yang tidak digunakan ?

Ramy
sumber
Terinspirasi oleh pertanyaan ini, saya membuat tutorial youtube yang mencakup variabel yang tidak digunakan dalam pemahaman daftar youtube.com/watch?v=cZb5aFcpsAs
Brendan Metcalfe

Jawaban:

132

_ adalah nama placeholder standar untuk anggota yang diabaikan dalam tugas perulangan dan tupel, misalnya

['' for _ in myList]

[a+d for a, _, _, d, _ in fiveTuples]

BTW daftar Anda dapat ditulis tanpa pemahaman daftar (dengan asumsi Anda ingin membuat daftar anggota yang tidak dapat diubah seperti string, bilangan bulat, dll.).

[''] * len(myList)
kennytm
sumber
10
Yang terakhir harus disertai dengan peringatan besar bahwa itu tidak melakukan hal yang diharapkan untuk objek yang bisa berubah.
5
@ Mohit:a=[[]]*4;a[0].append(5);print(a)
kennytm
@Ramy: Mohit memposting penjelasan tetapi telah dihapus: S Bagaimanapun, periksa Catatan 2 di docs.python.org/py3k/library/… .
kennytm
2
@Ramy, Python mempertahankan referensi yang sama untuk objek yang sama dalam memori.
Mohit Ranka
Apakah penting jika saya melakukan forloop bersarang , misalnya? Atau jika di dalam for _ in range(...)saya ingin mengatakan _, var = f(x)? Apakah akan membingungkan antara kedua _variabel?
Eric Auld
19

Tidak. Seperti yang dikatakan Zen: Kasus khusus tidak cukup khusus untuk melanggar aturan. Kasus khusus adalah loop yang tidak menggunakan item dari item yang diiterasi dan aturannya adalah bahwa ada "target" yang akan dibuka.

Namun, Anda dapat menggunakan _sebagai nama variabel, yang biasanya dipahami sebagai "sengaja tidak digunakan" (bahkan PyLint dll. Mengetahui dan menghormati ini).

tongkat
sumber
Namun PyLint mengeluh bahwa C: 10,24: Invalid variable name "_" (invalid-name)kecuali Anda menambahkannya ke good-namesdalam file .pylintrc.
giorgiosironi
13

Ternyata menggunakan dummy*(kata awal adalah dummy) sebagai nama variabel melakukan trik yang sama seperti _. _adalah standar yang diketahui dan akan lebih baik menggunakan nama variabel yang bermakna. Sehingga Anda dapat menggunakan dummy, dummy1, dummy_anything. Dengan menggunakan nama variabel PyLintini tidak akan mengeluh.

Alfred
sumber
Saya memang lebih suka pendekatan ini. itu tetap bermakna.
RvdK
2

Tambahkan komentar berikut setelah perulangan for pada baris yang sama:

#pylint: disable = unused-variable

for i in range(100): #pylint: disable=unused-variable
Christopher Nuzzi
sumber
1

Jika Anda perlu memberi nama argumen Anda (dalam kasus, misalnya, saat menulis olok-olok yang tidak menggunakan argumen tertentu yang direferensikan oleh nama), Anda dapat menambahkan metode pintasan ini:

def UnusedArgument(_):
  pass

dan kemudian gunakan seperti ini

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)
kateroh
sumber
0

Objek generator tidak benar-benar menggunakan variabel. Jadi seperti itu

list(('' for x in myList))

harus melakukan triknya. Perhatikan bahwa x tidak didefinisikan sebagai variabel di luar pemahaman generator.

highBandWidth
sumber
0

Anda juga dapat menambahkan nama variabel dengan _jika Anda lebih suka memberikan nama variabel yang dapat dibaca manusia. Sebagai contoh Anda dapat menggunakan _foo, _foo1, _anythingdan Pylint tidak akan mengeluh. Dalam loop for, akan seperti ini:

for _something in range(10):
    do_something_else()

edit: Tambahkan contoh

Adam Scharf
sumber
0

Cara verbose adalah:

newList = []
while len(newList) < len(mylist):
    newList.append('')

Anda menghindari mendeklarasikan variabel bekas dengan cara ini.

Anda juga dapat menambahkan objek yang dapat berubah dan tidak dapat diubah (seperti kamus) ke dalam newList .

Hal lain untuk pemula python seperti saya, '_', 'dummy' agak membingungkan.

James Barton
sumber
0

Cobalah, sederhana:

# Use '_' instead of the variable
for _ in range(any_number):
    do_somthing()
Gavriel Cohen
sumber
-1

Komentar untuk Bagaimana saya bisa berkeliling mendeklarasikan variabel yang tidak digunakan dalam loop for? (Kehabisan ukuran komentar)

Python mempertahankan referensi yang sama untuk objek yang dibuat. (terlepas dari mutabilitas), misalnya,

In [1]: i = 1

In [2]: j = 1

In [3]: id(i)
Out[3]: 142671248

In [4]: id(j)
Out[4]: 142671248

Anda, dapat melihat i dan j, mengacu pada objek yang sama di memori. Apa yang terjadi, ketika kita mengubah nilai dari satu variabel yang tidak dapat diubah.

In [5]: j = j+1

In [6]: id(i)
Out[6]: 142671248

In [7]: id(j)
Out[7]: 142671236

Anda dapat melihat j sekarang mulai menunjukkan lokasi baru, (di mana 2 disimpan), dan saya masih menunjuk ke lokasi di mana 1 disimpan. Saat mengevaluasi,

j = j+1

Nilai diambil dari 142671248, dihitung (jika belum di-cache), dan diletakkan di lokasi baru 142671236. j dibuat untuk menunjuk ke lokasi baru. Dalam istilah yang lebih sederhana, salinan baru dibuat setiap kali variabel yang tidak dapat diubah diubah.

Mutabilitas

Objek yang dapat berubah bertindak sedikit berbeda dalam hal ini. Ketika nilai ditunjukkan

In [16]: a = []

In [17]: b = a

In [18]: id(a)
Out[18]: 3071546412L

In [19]: id(b)
Out[19]: 3071546412L

Baik a dan b menunjuk ke lokasi memori yang sama.

In [20]: a.append(5)

Lokasi memori yang ditunjukkan oleh a diubah.

In [21]: a
Out[21]: [5]

In [22]: b
Out[22]: [5]

In [23]: id(a)
Out[23]: 3071546412L

In [24]: id(b)
Out[24]: 3071546412L

Baik a dan b, masih mengarah ke lokasi memori yang sama. Dengan kata lain, variabel yang dapat berubah bertindak dari lokasi memori yang sama yang ditunjukkan oleh variabel, alih-alih membuat salinan dari nilai yang ditunjukkan oleh variabel, seperti dalam kasus variabel yang tidak dapat diubah.

Mohit Ranka
sumber