Kullanılmayan bir değişkeni bir for döngüsünde bildirmekle nasıl başa çıkabilirim?


88

Bunun gibi bir liste anlayışım varsa (örneğin):

['' for x in myList]

Bir listedeki her öğe için boş bir dizeye sahip yeni bir liste oluştururken, asla x. Kullanılmayan xdeğişkeni bildirmek zorunda kalmamak için bunu yazmanın daha temiz bir yolu var mı?


Bu sorudan esinlenerek, liste anlamalarında kullanılmayan değişkenleri kapsayan bir youtube eğiticisi oluşturdum youtube.com/watch?v=cZb5aFcpsAs
Brendan Metcalfe

Yanıtlar:


132

_ bir for-loop ve tuple atamasında yok sayılan üyeler için standart bir yer tutucu adıdır, örn.

['' for _ in myList]

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

BTW listeniz liste anlayışı olmadan yazılabilir (dizeler, tamsayılar gibi değişmez üyelerin bir listesini yapmak istediğiniz varsayılarak).

[''] * len(myList)

10
İkincisine, değişken nesneler için beklenen şeyi yapmadığına dair büyük bir uyarı eşlik etmelidir.

5
@Mohit:a=[[]]*4;a[0].append(5);print(a)
kennytm

@Ramy: Mohit bir açıklama yayınladı ama silindi: S Her neyse, docs.python.org/py3k/library/… 'deki Notlar 2'ye bakın .
kennytm

2
@Ramy, Python bellekteki aynı nesne için aynı referansı korur.
Mohit Ranka

forÖrneğin, iç içe döngüler yapmamın bir önemi var mı ? Veya içeride for _ in range(...)söylemek istersem _, var = f(x)? İki _değişken arasında karışacak mı?
Eric Auld

19

Hayır. Zen'in ifade ettiği gibi: Özel durumlar kuralları çiğnemek için yeterince özel değildir. Özel durum, yinelenen şeyin öğelerini kullanmayan döngüler ve kural, paketin açılması gereken bir "hedef" olduğudur.

Bununla birlikte, _genellikle "kasıtlı olarak kullanılmamış" olarak anlaşılan değişken adı olarak kullanabilirsiniz (PyLint vb. Bile bunu bilir ve saygı duyar).


PyLint ancak şikayet C: 10,24: Invalid variable name "_" (invalid-name)sen eklemek sürece good-namesGözlerinde farklı .pylintrc.
giorgiosironi

13

dummy*Değişken adı olarak (başlangıç ​​kelimesi yapaydır) kullanmak ile aynı hile yaptığı ortaya çıktı _. _bilinen bir standarttır ve anlamlı değişken isimleri kullanmak daha iyi olacaktır. Eğer kullanabilirsiniz Yani dummy, dummy1, dummy_anything. Bu değişken isimlerini kullanmak PyLintşikayet etmeyecektir.


Ben gerçekten bu yaklaşımı tercih ediyorum. anlamlı kalır.
RvdK

2

Aynı satırdaki for döngüsünden sonra aşağıdaki yorumu ekleyin:

#pylint: devre dışı bırak = kullanılmayan değişken

for i in range(100): #pylint: disable=unused-variable

1

Bağımsız değişkenlerinizi adlandırmanız gerekirse (örneğin, ada göre referans verilen belirli bağımsız değişkenleri kullanmayan taklitler yazarken), şu kısayol yöntemini ekleyebilirsiniz:

def UnusedArgument(_):
  pass

ve sonra bunu böyle kullan

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

0

Oluşturucu nesneler aslında değişkenleri kullanmaz. Yani şöyle bir şey

list(('' for x in myList))

hile yapmalı. X'in üreteç anlayışının dışında bir değişken olarak tanımlanmadığını unutmayın.


0

_Değişkene insan tarafından okunabilir bir ad vermeyi tercih ederseniz, bir değişken adını da başına ekleyebilirsiniz . Örneğin kullanabileceğiniz _foo, _foo1, _anythingve PyLint şikayetçi olmaz. Bir for döngüsünde şöyle olur:

for _something in range(10):
    do_something_else()

düzenle: Örnek ekle


0

Ayrıntılı bir yol:

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

Bu şekilde kullanılmış bir değişkeni bildirmekten kaçınırsınız.

Ayrıca hem değişken hem de değişmez nesneleri (sözlükler gibi) içine ekleyebilirsiniz newList.

Benim gibi python yeni başlayanlar için başka bir şey, '_', 'kukla' biraz endişe verici.


0

Deneyin, çok basit:

# Use '_' instead of the variable
for _ in range(any_number):
    do_somthing()

-1

Bir for döngüsünde kullanılmayan bir değişkeni bildirmekle nasıl başa çıkabilirim? (Yorum boyutu tükendi)

Python, oluşturulan nesne için aynı referansı korur. (değişebilirlikten bağımsız olarak), örneğin,

In [1]: i = 1

In [2]: j = 1

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

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

Hem i hem de j nin bellekte aynı nesneye başvurduğunu görebilirsiniz. Bir değişmez değişkenin değerini değiştirdiğimizde ne olur.

In [5]: j = j+1

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

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

Şimdi j'nin yeni bir konumu göstermeye başladığını görebilirsiniz (2'nin saklandığı yer) ve i hala 1'in depolandığı konumu gösteriyor. Değerlendirirken,

j = j+1

Değer 142671248'den alınır, hesaplanır (önceden önbelleğe alınmamışsa) ve 142671236 yeni bir konuma yerleştirilir. J, yeni konumu gösterecek şekilde yapılır. Daha basit bir ifadeyle, değişmez bir değişken her değiştirildiğinde yeni bir kopya oluşturulur.

Değişkenlik

Değişken nesneler bu açıdan biraz farklı davranır. Değerin işaret ettiği zaman

In [16]: a = []

In [17]: b = a

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

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

Hem a hem de b aynı hafıza konumuna işaret eder.

In [20]: a.append(5)

A ile gösterilen bellek konumu değiştirildi.

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

Hem a hem de b, hala aynı hafıza konumuna işaret ediyor. Başka bir deyişle, değişebilen değişkenler, değişmez değişken durumunda olduğu gibi, değişken tarafından gösterilen değerin bir kopyasını yapmak yerine, değişken tarafından gösterilen aynı bellek konumunda hareket eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.