ล้างตัวแปรในไพ ธ อน


207

มีวิธีการล้างค่าของตัวแปรในหลามหรือไม่?

เช่นถ้าฉันกำลังใช้ต้นไม้ไบนารี:

Class Node:
    self.left = somenode1
    self.right = somenode2

หากฉันต้องการลบโหนดบางส่วนจากต้นไม้ฉันจะต้องตั้งค่าself.leftให้ว่างเปล่า


คำตอบ:


157

มีอะไรผิดปกติกับself.left = None?


19
ไม่คุ้นเคยกับคำหลักไม่มี สิ่งนี้คล้ายกับ null ในภาษาอื่นหรือไม่?
Bnicholas

6
ใช่; มันเทียบเท่ากับ null
Smashery

12
@Bnicholas อย่างไรก็ตามมันไม่เหมือนnullใน PHP ในการตั้งค่าตัวแปรเป็นnullใน PHP ให้พฤติกรรมที่คล้ายกันในกรณีส่วนใหญ่ราวกับว่าคุณไม่ได้กำหนดไว้ในสถานที่แรก ค่าเป็นNonein Python ค่อนข้างแตกต่างจากตัวแปรที่ไม่ได้กำหนด Noneก็เหมือนกับอวตารอื่น ๆ ส่วนใหญ่ของnullอย่างไรก็ตาม (จนกว่าเราจะได้รับรายละเอียด arcane เพิ่มเติมอย่างน้อย)
Ben

มันไม่ใช่คำหลัก มันเป็นชื่อเริ่มต้นสำหรับวัตถุในตัว คุณสามารถทำอะไรก็ได้กับสิ่งNoneที่คุณสามารถทำได้กับวัตถุ "ธรรมดา" อื่น ๆ ที่ไม่ได้ระบุประเภท: เก็บไว้ในภาชนะบรรจุพิมพ์การแทนค่าสตริงตรวจสอบข้อมูลเมตาของมัน ... อย่างไรก็ตามคุณลองใช้ Google สำหรับ "python null เทียบเท่า "? ฉันจริงจัง มันจะใช้เวลาในการวิเคราะห์ แต่ข้อมูลอยู่ตรงนั้น
Karl Knechtel

18
เปิดเทอร์มินัลหลามแล้วพิมพ์print xและกด สิ่งนี้จะสร้างข้อผิดพลาดของล่ามเช่นเดียวกับภาษาส่วนใหญ่เมื่อคุณพยายามพิมพ์ตัวแปรที่ไม่ได้กำหนด แต่ถ้าคุณกำหนดตัวแปรแล้วลองล้างมันด้วย None การใช้print xรหัสจะสร้างคำNoneเป็นผลลัพธ์ ฉันใหม่กับงูหลามดังนั้นฉันจึงอาจเข้าใจผิด แต่สิ่งนี้ดูเหมือนจะไม่เหมือนกับการทำงานของตัวแปรที่เคลียร์
Musixauce3000

407

delคำหลักที่จะทำ

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

แต่ในกรณีนี้ฉันลงคะแนนให้ self.left = None


18
บางครั้งสิ่งนี้ไม่ได้ลบออกทั้งหมดเพียงแค่ลบการอ้างอิงนั้นไปยังหน่วยความจำใน สิ่งนี้สามารถทำให้ตัวแปร ghost อยู่ในหน่วยความจำที่ไม่ได้รับ gc
Jakob Bowyer

4
delนอกจากนี้ยังมีข้อเสียที่ถ้าคุณพยายามลบตัวแปรที่ไม่มีอยู่มันจะส่งข้อยกเว้นซึ่งมักจะไม่พึงประสงค์
Philip Kearns

33
ฉันแค่อยากจะชี้ให้เห็นว่าถ้าคุณบังเอิญประกาศตัวแปรที่เขียนทับคำสั่งในตัวเช่นtype=… เมื่อคุณต้องการพิมพ์type(…)แล้วการลบมันเป็นวิธีที่ง่ายที่สุดในการกลับไปใช้ฟังก์ชั่นดั้งเดิม นั่นคือถ้าคุณเก็บไว้เป็นไม่มีคุณจะยังคงถูกตัดการเข้าถึงฟังก์ชั่นพื้นฐาน
mpacer

1
การเก็บรวบรวมขยะ / นักสะสม / รวบรวม
mccc

1
นี่คือสิ่งที่ฉันกำลังมองหา เล่นที่บรรทัด cmd ฉันมี ... set = set(myList)และจากนั้นฉันก็ตระหนักว่าฉันไม่สามารถใช้การตั้งค่าอีกต่อไปเป็นฟังก์ชั่น (doh) ใช้del setอนุญาตให้ฉันใช้อีกครั้งเป็น fx แน่นอนฉันไม่เคยใช้ var ที่สงวนไว้ในสคริปต์จริง
jbchurchill

111

var = None "ล้างค่า" การตั้งค่าของตัวแปรเป็น "null" เช่นค่า "None" อย่างไรก็ตามตัวชี้ไปยังตัวแปรยังคงอยู่

del var ลบนิยามสำหรับตัวแปรทั้งหมด

ในกรณีที่คุณต้องการใช้ตัวแปรในภายหลังเช่นตั้งค่าใหม่ให้กับตัวแปรเช่นคงตัวแปรไว้Noneจะดีกว่า


จะทำอย่างไรถ้าฉันต้องการลบตัวแปรอย่างสมบูรณ์ซึ่งในบางสถานการณ์ไม่มีอยู่ มีพารามิเตอร์เพื่อหลีกเลี่ยงข้อผิดพลาดหรือไม่? ฉันต้องการลบตัวแปรหลายตัว: del a, b, c, d ฉันสามารถใช้ลูปและลอง / ยกเว้น แต่ฉันชอบสวิตช์บางอย่างเพื่อหลีกเลี่ยงมัน
Tedo Vrbanec

63

จริงๆแล้วมันไม่ได้ลบตัวแปร / คุณสมบัติ สิ่งที่มันจะทำคือตั้งค่าเป็นNoneดังนั้นตัวแปรจะยังคงใช้พื้นที่ในหน่วยความจำ หากคุณต้องการล้างการมีอยู่ทั้งหมดของตัวแปรจากหน่วยความจำคุณสามารถพิมพ์:

del self.left

8
ฉันไม่เข้าใจว่าทำไมคำตอบ = None จึงเป็นที่นิยม นี่คือคำตอบที่ถูกต้อง
Nikolay Gromov

1
สหกรณ์กล่าวว่าไม่clear removedel จะฆ่าแอตทริบิวต์และการค้นหา มันเป็นวิธีที่สะอาดกว่าในการตั้งค่าเป็นไม่มีมากกว่าที่คุณสามารถตรวจสอบif self.leftและมันจะดีพอที่จะตรวจสอบว่าโหนดว่างเปล่า
user1767754

"มันเป็นวิธีที่สะอาดกว่าที่จะตั้งค่าเป็นไม่มี" - มันคุ้มค่าที่จะพิจารณาว่าหากมีใครบางคน (ตัวคุณเองในเวลาต่อมาหรือผู้ทำงานร่วมกัน) กำลังอ่านโค้ดdelIMHO ทำให้ชัดเจนยิ่งขึ้นว่าตัวแปรสามารถลืมได้เมื่อ ' รหัส.
Pocketsand

1
@ NikolayGromov ในรหัสวันต่อวันของคุณเมื่อคุณต้องการได้รับคุณค่าของตนเองคุณมักจะต้องการตรวจสอบif self.left:หรือคุณต้องการที่จะจัดการกับข้อยกเว้น NameError ที่เป็นไปได้ที่จะทำให้โปรแกรมของคุณล้มเหลวหากคุณไม่จัดการทุกที่ ?
Pierre.Sassoulas

33
  • หากต้องการลบโดยสิ้นเชิงให้ใช้del:

    del your_variable

  • หรือมิฉะนั้นเพื่อให้ค่าNone :

    your_variable = None

  • หากเป็นซ้ำ ๆ (เช่นรายการหรือทูเปิล) คุณสามารถทำให้ว่างเช่น:

    your_variable.clear()

จากนั้นyour_variableจะว่างเปล่า


สำหรับตัวเลือกที่สอง "การล้างเนื้อหา" ไม่ถูกต้องนี่จะกำหนดตัวแปรใหม่เป็น None เท่านั้น แต่วัตถุดั้งเดิมจะยังคงอยู่ (ยกเว้นการนับการอ้างอิงจะลดลงเหลือศูนย์ในกรณีที่มีการรวบรวมขยะ)
cs95

0

คุณต้องการลบตัวแปรใช่ไหม?

ตกลงฉันคิดว่าฉันมีความคิดทางเลือกที่ดีที่สุดสำหรับ @bnul คำตอบ:

คุณสามารถลบชื่อบุคคลได้ด้วยdel:

del x หรือคุณสามารถลบออกจากวัตถุ globals ():

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

นี่เป็นเพียงตัวอย่างลูป มันจะลบเฉพาะชื่อที่ไม่ได้ขึ้นต้นด้วยเครื่องหมายขีดเส้นใต้ทำให้เป็นสมมติฐาน (ไม่ไร้เหตุผล) ที่คุณใช้ชื่อโดยไม่มีเครื่องหมายขีดล่างที่จุดเริ่มต้นในล่ามของคุณ คุณสามารถใช้รายชื่อแบบเข้ารหัสเพื่อเก็บแทน (รายการที่อนุญาต) หากคุณต้องการให้ละเอียด ไม่มีฟังก์ชั่นในตัวที่ทำการล้างข้อมูลสำหรับคุณยกเว้นเพียงแค่ออกและรีสตาร์ทล่าม

โมดูลที่คุณนำเข้า (import os) จะยังคงถูกนำเข้าเนื่องจากถูกอ้างอิงโดย sys.modules การนำเข้าที่ตามมาจะนำวัตถุโมดูลที่นำเข้ามาแล้วมาใช้ซ้ำ คุณจะไม่มีการอ้างอิงถึงพวกเขาใน namespace ทั่วโลกปัจจุบันของคุณ

โปรดพิจารณาคำตอบนี้อีกครั้ง!


-1

ฉันใช้ตัวเลือกที่กล่าวถึงข้างต้น:

del self.left

หรือการตั้งค่าเป็นไม่มีการใช้

self.left = None

เป็นสิ่งสำคัญที่จะต้องทราบความแตกต่างและวางตัวจัดการข้อยกเว้นไว้เมื่อคุณใช้ตั้งค่าเป็นไม่มี หากคุณกำลังพิมพ์ค่าของข้อความสั่งแบบมีเงื่อนไขโดยใช้เทมเพลตให้พูดว่า

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

คุณอาจเห็นค่าของการพิมพ์ตัวแปร "ค่าของตัวแปรคือไม่มี" ดังนั้นคุณต้องใส่ตัวจัดการข้อยกเว้นบางประการที่นั่น:

if self.left:
    #Then only print stuff

คำสั่งดังกล่าวจะพิมพ์ค่าถ้า self.left ไม่ได้ None

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.