มีวิธีการล้างค่าของตัวแปรในหลามหรือไม่?
เช่นถ้าฉันกำลังใช้ต้นไม้ไบนารี:
Class Node:
self.left = somenode1
self.right = somenode2
หากฉันต้องการลบโหนดบางส่วนจากต้นไม้ฉันจะต้องตั้งค่าself.leftให้ว่างเปล่า
มีวิธีการล้างค่าของตัวแปรในหลามหรือไม่?
เช่นถ้าฉันกำลังใช้ต้นไม้ไบนารี:
Class Node:
self.left = somenode1
self.right = somenode2
หากฉันต้องการลบโหนดบางส่วนจากต้นไม้ฉันจะต้องตั้งค่าself.leftให้ว่างเปล่า
คำตอบ:
มีอะไรผิดปกติกับself.left = None?
nullใน PHP ในการตั้งค่าตัวแปรเป็นnullใน PHP ให้พฤติกรรมที่คล้ายกันในกรณีส่วนใหญ่ราวกับว่าคุณไม่ได้กำหนดไว้ในสถานที่แรก ค่าเป็นNonein Python ค่อนข้างแตกต่างจากตัวแปรที่ไม่ได้กำหนด Noneก็เหมือนกับอวตารอื่น ๆ ส่วนใหญ่ของnullอย่างไรก็ตาม (จนกว่าเราจะได้รับรายละเอียด arcane เพิ่มเติมอย่างน้อย)
Noneที่คุณสามารถทำได้กับวัตถุ "ธรรมดา" อื่น ๆ ที่ไม่ได้ระบุประเภท: เก็บไว้ในภาชนะบรรจุพิมพ์การแทนค่าสตริงตรวจสอบข้อมูลเมตาของมัน ... อย่างไรก็ตามคุณลองใช้ Google สำหรับ "python null เทียบเท่า "? ฉันจริงจัง มันจะใช้เวลาในการวิเคราะห์ แต่ข้อมูลอยู่ตรงนั้น
print xและกด สิ่งนี้จะสร้างข้อผิดพลาดของล่ามเช่นเดียวกับภาษาส่วนใหญ่เมื่อคุณพยายามพิมพ์ตัวแปรที่ไม่ได้กำหนด แต่ถ้าคุณกำหนดตัวแปรแล้วลองล้างมันด้วย None การใช้print xรหัสจะสร้างคำNoneเป็นผลลัพธ์ ฉันใหม่กับงูหลามดังนั้นฉันจึงอาจเข้าใจผิด แต่สิ่งนี้ดูเหมือนจะไม่เหมือนกับการทำงานของตัวแปรที่เคลียร์
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
delนอกจากนี้ยังมีข้อเสียที่ถ้าคุณพยายามลบตัวแปรที่ไม่มีอยู่มันจะส่งข้อยกเว้นซึ่งมักจะไม่พึงประสงค์
type=… เมื่อคุณต้องการพิมพ์type(…)แล้วการลบมันเป็นวิธีที่ง่ายที่สุดในการกลับไปใช้ฟังก์ชั่นดั้งเดิม นั่นคือถ้าคุณเก็บไว้เป็นไม่มีคุณจะยังคงถูกตัดการเข้าถึงฟังก์ชั่นพื้นฐาน
set = set(myList)และจากนั้นฉันก็ตระหนักว่าฉันไม่สามารถใช้การตั้งค่าอีกต่อไปเป็นฟังก์ชั่น (doh) ใช้del setอนุญาตให้ฉันใช้อีกครั้งเป็น fx แน่นอนฉันไม่เคยใช้ var ที่สงวนไว้ในสคริปต์จริง
var = None "ล้างค่า" การตั้งค่าของตัวแปรเป็น "null" เช่นค่า "None" อย่างไรก็ตามตัวชี้ไปยังตัวแปรยังคงอยู่
del var ลบนิยามสำหรับตัวแปรทั้งหมด
ในกรณีที่คุณต้องการใช้ตัวแปรในภายหลังเช่นตั้งค่าใหม่ให้กับตัวแปรเช่นคงตัวแปรไว้Noneจะดีกว่า
จริงๆแล้วมันไม่ได้ลบตัวแปร / คุณสมบัติ สิ่งที่มันจะทำคือตั้งค่าเป็นNoneดังนั้นตัวแปรจะยังคงใช้พื้นที่ในหน่วยความจำ หากคุณต้องการล้างการมีอยู่ทั้งหมดของตัวแปรจากหน่วยความจำคุณสามารถพิมพ์:
del self.left
clear removedel จะฆ่าแอตทริบิวต์และการค้นหา มันเป็นวิธีที่สะอาดกว่าในการตั้งค่าเป็นไม่มีมากกว่าที่คุณสามารถตรวจสอบif self.leftและมันจะดีพอที่จะตรวจสอบว่าโหนดว่างเปล่า
delIMHO ทำให้ชัดเจนยิ่งขึ้นว่าตัวแปรสามารถลืมได้เมื่อ ' รหัส.
if self.left:หรือคุณต้องการที่จะจัดการกับข้อยกเว้น NameError ที่เป็นไปได้ที่จะทำให้โปรแกรมของคุณล้มเหลวหากคุณไม่จัดการทุกที่ ?
หากต้องการลบโดยสิ้นเชิงให้ใช้del:
del your_variable
หรือมิฉะนั้นเพื่อให้ค่าNone :
your_variable = None
หากเป็นซ้ำ ๆ (เช่นรายการหรือทูเปิล) คุณสามารถทำให้ว่างเช่น:
your_variable.clear()
จากนั้นyour_variableจะว่างเปล่า
คุณต้องการลบตัวแปรใช่ไหม?
ตกลงฉันคิดว่าฉันมีความคิดทางเลือกที่ดีที่สุดสำหรับ @bnul คำตอบ:
คุณสามารถลบชื่อบุคคลได้ด้วยdel:
del x
หรือคุณสามารถลบออกจากวัตถุ globals ():
for name in dir():
if not name.startswith('_'):
del globals()[name]
นี่เป็นเพียงตัวอย่างลูป มันจะลบเฉพาะชื่อที่ไม่ได้ขึ้นต้นด้วยเครื่องหมายขีดเส้นใต้ทำให้เป็นสมมติฐาน (ไม่ไร้เหตุผล) ที่คุณใช้ชื่อโดยไม่มีเครื่องหมายขีดล่างที่จุดเริ่มต้นในล่ามของคุณ คุณสามารถใช้รายชื่อแบบเข้ารหัสเพื่อเก็บแทน (รายการที่อนุญาต) หากคุณต้องการให้ละเอียด ไม่มีฟังก์ชั่นในตัวที่ทำการล้างข้อมูลสำหรับคุณยกเว้นเพียงแค่ออกและรีสตาร์ทล่าม
โมดูลที่คุณนำเข้า (import os) จะยังคงถูกนำเข้าเนื่องจากถูกอ้างอิงโดย sys.modules การนำเข้าที่ตามมาจะนำวัตถุโมดูลที่นำเข้ามาแล้วมาใช้ซ้ำ คุณจะไม่มีการอ้างอิงถึงพวกเขาใน namespace ทั่วโลกปัจจุบันของคุณ
โปรดพิจารณาคำตอบนี้อีกครั้ง!
ฉันใช้ตัวเลือกที่กล่าวถึงข้างต้น:
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