ดูเหมือนว่า "สกปรก" การล้างรายการด้วยวิธีนี้:
while len(alist) > 0 : alist.pop()
มีวิธีที่ชัดเจนในการทำเช่นนั้นหรือไม่?
ดูเหมือนว่า "สกปรก" การล้างรายการด้วยวิธีนี้:
while len(alist) > 0 : alist.pop()
มีวิธีที่ชัดเจนในการทำเช่นนั้นหรือไม่?
คำตอบ:
สิ่งนี้จะลบเนื้อหาออกจากรายการ แต่จะไม่แทนที่ป้ายกำกับเก่าด้วยรายการเปล่าใหม่:
del lst[:]
นี่คือตัวอย่าง:
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
เพื่อความสมบูรณ์การมอบหมายชิ้นมีผลเหมือนกัน:
lst[:] = []
นอกจากนี้ยังสามารถใช้เพื่อย่อส่วนของรายการในขณะที่เปลี่ยนชิ้นส่วนในเวลาเดียวกัน (แต่ไม่อยู่นอกขอบเขตของคำถาม)
โปรดทราบว่าการทำlst = []
ไม่ได้ทำให้รายการว่างเปล่าเพียงแค่สร้างวัตถุใหม่และผูกกับตัวแปรlst
แต่รายการเก่าจะยังคงมีองค์ประกอบเดียวกันและเอฟเฟกต์จะปรากฏหากมีการผูกตัวแปรอื่น ๆ
หากคุณกำลังใช้งูหลาม 3.3 หรือดีกว่าคุณสามารถใช้clear()
วิธีการlist
ซึ่งขนานกับclear()
ของdict
, set
, deque
และอื่น ๆ ประเภทภาชนะไม่แน่นอน:
alist.clear() # removes all items from alist (equivalent to del alist[:])
alist *= 0
ตามหน้าเอกสารประกอบการเชื่อมโยงที่สามารถเดียวกันยังทำได้ด้วย
สรุปแล้วมีวิธีที่เทียบเท่าสี่วิธีในการล้างรายการในสถานที่ (ค่อนข้างตรงข้ามกับZen of Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
คุณสามารถลอง:
alist[:] = []
ซึ่งหมายความว่า: ประกบกันในรายการ[]
(0 องค์ประกอบ) ที่ตำแหน่ง[:]
(ดัชนีทั้งหมดตั้งแต่ต้นจนจบ)
[:] เป็นตัวดำเนินการชิ้น ดูคำถามนี้สำหรับข้อมูลเพิ่มเติม
alist = []
?
alist
ด้วยรายการอื่นซึ่งเกิดขึ้นเป็นค่าว่าง ถ้าใครมีการอ้างอิงถึงรายการเดิมที่ยังคงเป็นคือ (คือมันมีสิ่งที่อยู่ในนั้นจะเริ่มต้นด้วย)
alist.clear()
หรือalist[:] = []
ช่วยตรวจสอบว่าalist
เป็นรายการอย่างแท้จริง สมมติว่าคุณได้รับกลับมาจากฟังก์ชั่นalist
foo()
คุณคิดว่าfoo
ส่งคืนรายการ แต่จริง ๆ แล้วส่งคืนNone
รายการ การใช้alist = []
ไม่สามารถเข้าใจความผิดพลาดนั้นได้
ปรากฎว่าด้วย python 2.5.2 del l[:]
ช้ากว่าl[:] = []
1.1 usec เล็กน้อย
$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2
.clear()
, del b[:]
และb[:]=[]
วิ่งเหมือนกันทั้งหมด ( b[:]=[]
เป็นช้าลงเล็กน้อย.
lst *= 0
มีผลเช่นเดียวกับ
lst[:] = []
มันง่ายกว่าเล็กน้อยและอาจจำได้ง่ายกว่า นอกเหนือจากนั้นไม่มีอะไรจะพูดมาก
ประสิทธิภาพดูเหมือนจะใกล้เคียงกัน
0
จะมีผลเหมือนกัน มันเป็นเคล็ดลับที่ค่อนข้างเรียบร้อยฉันเสียใจนิดหน่อยที่มันไม่ได้รับความสนใจมากนัก
list = []
จะรีเซ็ตlist
เป็นรายการว่าง
โปรดทราบว่าโดยทั่วไปคุณไม่ควรใช้ชื่อฟังก์ชันที่สงวนไว้ของเงาเช่นlist
ซึ่งเป็นตัวสร้างสำหรับรายการวัตถุ - คุณสามารถใช้lst
หรือlist_
แทนตัวอย่างเช่น
list
นี้จะไม่ปรับเปลี่ยนรายการนี้ก็จะกำหนดรายการที่ว่างเปล่าให้กับตัวแปร หากคุณคาดหวังให้ฟังก์ชันแก้ไขรายการส่งผ่าน (ตัวอย่าง) สิ่งนี้จะไม่ทำสิ่งที่คุณต้องการ
อีกรหัสง่าย ๆ ที่คุณสามารถใช้ได้ (ขึ้นอยู่กับสถานการณ์ของคุณ) คือ:
index=len(list)-1
while index>=0:
del list[index]
index-=1
คุณต้องเริ่มต้นดัชนีที่ความยาวของรายการและย้อนกลับไปเทียบกับดัชนีที่ 0 เป็นต้นไปเพราะนั่นจะทำให้คุณมีดัชนีเท่ากับความยาวของรายการโดยจะถูกตัดครึ่งเท่านั้น
นอกจากนี้ตรวจสอบให้แน่ใจว่าในขณะที่บรรทัดมีเครื่องหมาย "มากกว่าหรือเท่ากับ" การข้ามไปจะทำให้คุณเหลือรายการ [0]