Python'daki değişkeni temizle


Yanıtlar:


157

Sorun nedir self.left = None?


19
None anahtar sözcüğüne aşina değil. Bu diğer dillerde null benzer mi?
Bnicholas

6
Evet; null değerine eşdeğerdir.
Smashery

12
@Bnicholas Ancak nullPHP'de olduğu gibi , PHP'de bir değişkenin ayarlanması null, ilk etapta bunu tanımlamamış olmanız gibi size benzer davranışlar verir. NonePython'daki bir değer, tanımsız bir değişkenden oldukça farklı. Bununla birlikte, Nonediğer enkarnasyonların çoğu gibidir null(en azından daha fazla gizli ayrıntıya girene kadar).
Ben

Bir anahtar kelime değil; yerleşik bir nesne için varsayılan olarak ayarlanmış bir addır. NoneBelirtilmemiş türde başka bir "düz" nesne ile yapabileceğiniz her şeyi yapabilirsiniz: kaplarda saklayın, dize temsili yazdırın, üzerinde bazı meta veriler kontrol edin ... Her neyse, Google'ı "python null için denediniz mi? eşdeğer"? Ciddiyim; biraz analiz gerektirecek, ancak bilgi tam orada.
Karl Knechtel

18
Python terminalini açın ve yazın print xve enter tuşuna basın. Tanımsız bir değişken yazdırmaya çalıştığınızda çoğu dilde olduğu gibi bu da bir yorumlayıcı hatası oluşturur. Ancak değişkeni tanımlarsanız ve sonra Yok ile temizlemeye çalışırsanız, print xkodu kullanmak sözcüğü Noneçıktı olarak üretir. Python için yeniyim, bu yüzden yanılmış olabilirim, ancak bu temizlenmiş bir değişkenin davranışı gibi görünmüyor.
Musixauce3000

407

delAnahtar kelime yapardı.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Ama bu durumda oy veriyorum self.left = None


18
bazen bu tamamen kaldırmaz, bu sadece bir referansı bellekteki bir referanstan kaldırır. Bu, gc almayan hayalet değişkenlerini bellekte bırakabilir.
Jakob Bowyer

4
deldezavantajı var olmayan bir değişkeni silmeye çalışırsanız, genellikle istenmeyen bir istisna atar .
Philip Kearns

33
Sadece işaret etmek istediğini yanlışlıkla, komutlar örneğin inşa üzerinin bir değişken deklare eğer type=… siz yazarken isterken type(…)o zaman orijinal işlevselliğini geri almanın en kolay yoludur silme. Yani, onu Yok olarak tutarsanız, temel işlevlere erişimi kesmeye devam edersiniz.
mpacer

1
Çöp Toplama / Toplayıcı / Toplanan
mccc

1
Aradığım şey buydu. Cmd hattında oynadım ... set = set(myList)ve sonra set artık bir işlev (doh) olarak kullanamayacağımı fark ettim. Kullanmak del settekrar fx olarak kullanmama izin verdi. Tabii ki bu ayrılmış var asla gerçek bir komut dosyasında kullanmazdım.
jbchurchill

111

var = None "değeri temizler", değişkenin değerini "Yok" gibi "null" değerine ayarlar, ancak değişkenin göstericisi kalır.

del var değişkenin tanımını tamamen kaldırır.

Değişkeni daha sonra kullanmak istediğinizde, örneğin değişken için yeni bir değer ayarlamak, yani değişkeni korumak Nonedaha iyi olur.


Bazı durumlarda var olmayan değişkeni tamamen silmek istersem ne olur? Hatadan kaçınmak için herhangi bir parametre var mı? Birkaç değişkenleri silmem gerekiyor: del a, b, c, d Döngüyü kullanabilir ve deneyebilirim / hariç tutabilirim, ancak bunu önlemek için bazı anahtarları tercih ederim.
Tedo Vrbanec

63

Aslında bu, değişkeni / özelliği silmez. Tek yapacağı değeriNone , bu nedenle değişken hala bellekte yer kaplar. Değişkenin tüm varlığını bellekten tamamen silmek istiyorsanız, şunu yazabilirsiniz:

del self.left

8
= Yok cevabının neden bu kadar popüler olduğunu anlamıyorum. Doğru cevap bu
Nikolay Gromov

1
OP söyledi cleardeğildi remove. del, niteliği ve aramaları öldürür. Yok olarak ayarlamanız çok daha temizdir, kontrol edebileceğinizden if self.leftve bir düğümün boş olup olmadığını kontrol etmek için yeterince iyi olacaktır.
user1767754

"Hiçbiri'ni ayarlamak çok daha temiz" - Birisi (bir süre sonra kendiniz veya bir ortak çalışan) kodu okuyorsa del, IMHO, değişkenin zihinsel olarak ayrıştırıldığında unutulabileceğini daha açık hale getiriyor. 'kod.
Ceplerve

1
@NikolayGromov günlük kodunuzda, self.left değerini almak istediğinizde kontrol etmeyi mi tercih edersiniz yoksa her yerde işlemezseniz programınızı çökertecek if self.left:olası bir NameError istisnasıyla uğraşmayı mı tercih edersiniz? ?
Pierre.Sassoulas

33
  • Talep için ise tamamen silmek o kullanmak del:

    del your_variable

  • Ya da başka türlü, değeri yapmak içinNone :

    your_variable = None

  • Bir buysa iterable (örneğin bir liste veya başlığın gibi), bunu böyle boşaltmak yapabilirsiniz:

    your_variable.clear()

O your_variablezaman boş olacak


İkinci seçenek için, "içeriğini temizle" doğru değildir, bu yalnızca değişkeni Yok olarak yeniden atayacaktır, orijinal nesne yine de kalacaktır (referans sayısı sıfıra düşmediği sürece bu durumda çöp toplanır).
cs95

0

Bir değişkeni silmek istiyor musunuz?

tamam, bnul cevabı için en iyi alternatif fikrim var:

İle ayrı ayrı adları silebilirsiniz del :

del x veya globals () nesnesinden kaldırabilirsiniz:

for name in dir(): if not name.startswith('_'): del globals()[name]

Bu sadece bir örnek döngüdür; sadece altçizgi ile başlamayan isimleri defalarca siler ve yorumcunuzun başında sadece altçizgi olmadan isimleri kullandığınızı (mantıksız olmayan) varsayar. Gerçekten ayrıntılı olmak istiyorsanız sabit kodlu bir ad listesi kullanabilirsiniz (beyaz liste). Tercümandan çıkmak ve yorumlayıcıyı yeniden başlatmak dışında, sizin için temizliği yapacak yerleşik bir işlev yoktur.

İçe aktardığınız modüller (içe aktarma os) sys.modules tarafından referans aldıkları için içe aktarılmış olarak kalacaktır; sonraki içe aktarmalar zaten içe aktarılan modül nesnesini yeniden kullanır. Geçerli global ad alanınızda bunlara referansınız olmayacak.

Lütfen bu cevabı tekrar düşünün!


-1

Yukarıda belirtilen birkaç seçeneği kullandım:

del self.left

veya kullanarak değeri Yok olarak ayarlama

self.left = None

Değeri Hiçbiri olarak ayarladığınızda, farklılıkları bilmek ve birkaç özel durum işleyicisini yerine koymak önemlidir. Koşullu ifadelerin değerini bir şablon kullanarak yazdırıyorsanız,

print("The value of the variable is {}".format(self.left))

"Değişkenin değeri Yok" değişken baskısının değerini görebilirsiniz. Bu nedenle, birkaç istisna işleyicisi koymanız gerekir:

if self.left:
    #Then only print stuff

Yukarıdaki komut değerleri yalnızca self.left değilse yazdırır None

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.