2.7. รายการ

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

2.7.1. การสร้างรายการ

วงเล็บเหลี่ยมสร้างลิเทอรัลรายการ:

empty   = []
nums    = [1, 2, 3]
mixed   = [1, "two", 3.0, True, None]    # any types
nested  = [[1, 2], [3, 4], [5, 6]]       # lists of lists

ตัวสร้าง list สร้างรายการจาก iterable ใดก็ได้:

>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]

2.7.2. ความยาว การจัดทำดัชนี และการแบ่งส่วน

len() คืนค่าจำนวนรายการ การจัดทำดัชนีและการแบ่งส่วนทำงานเช่นเดียวกับสตริง ตำแหน่งเริ่มต้นที่ 0 ดัชนีลบนับจากท้าย และส่วนที่อยู่นอกช่วงที่ถูกต้องจะถูกตัดโดยไม่เกิดข้อผิดพลาด:

>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
A list of six cells, with positive indices 0..5 above and negative indices -6..-1 below each cell.

ดัชนีบวกนับจากต้น ดัชนีลบนับจากท้าย

ไวยากรณ์การแบ่งส่วนเป็นชวเลขสำหรับออบเจกต์ slice ที่ Python สร้างเบื้องหลัง nums[1:4] เหมือนกับ nums[slice(1, 4)] คุณแทบไม่ต้องสร้างมันด้วยมือ แต่ slice() มีประโยชน์บางครั้งสำหรับเก็บการแบ่งส่วนเป็นค่าเพื่อนำมาใช้ซ้ำ:

head = slice(0, 3)
print(nums[head])             # [10, 20, 30]
print(letters[head])          # first three letters, same slice

2.7.3. การแก้ไขรายการ

รายการรองรับการกำหนดค่าด้วยดัชนีและการแบ่งส่วนในที่เดียวกัน:

>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400]    # slice can change the length
>>> nums
[99, 200, 300, 400]

เมธอดรายการที่พบบ่อยที่สุด:

  • list.append() -- เพิ่มรายการเดียวไปที่ท้าย

  • list.extend() -- ต่อท้ายทุกรายการจาก iterable

  • list.insert() -- แทรกที่ตำแหน่งที่กำหนด

  • list.remove() -- ลบการปรากฏครั้งแรกของค่า

  • list.pop() -- ลบและคืนรายการ (ท้ายสุดโดยค่าเริ่มต้น)

  • list.clear() -- ลบทุกรายการออก

  • list.sort() -- เรียงลำดับในที่เดียวกัน ส่ง reverse=True สำหรับลำดับจากมากไปน้อย

  • list.reverse() -- กลับลำดับในที่เดียวกัน

>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]

เมธอดเหล่านี้แก้ไขรายการในที่เดียวกันและคืนค่า None การเขียน

nums = nums.sort()    # nums is now None -- common bug

แทบไม่ใช่สิ่งที่คุณต้องการ nums เดิมถูกเรียงลำดับแล้ว แต่การกำหนดค่าจะเขียนทับชื่อด้วยค่าที่ส่งกลับมา ควรเรียก nums.sort() บนบรรทัดของตัวเอง หรือใช้ sorted() ในตัวเพื่อได้รายการที่เรียงลำดับใหม่โดยไม่แก้ไขของเดิม

2.7.4. ตัวดำเนินการ

  • + เชื่อมสองรายการเข้าเป็นรายการใหม่

  • * ทำซ้ำรายการ

  • in ทดสอบการเป็นสมาชิก

>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True

2.7.5. การวนซ้ำรายการ

ลูป for เดินผ่านรายการตามลำดับ:

for n in [10, 20, 30]:
    print(n)

2.7.6. นามแฝงและการแก้ไข

รายการเป็นค่าเดียวในหน่วยความจำ หลายชื่อสามารถชี้ไปที่รายการเดียวกันได้ การแก้ไขผ่านชื่อหนึ่งจะมองเห็นได้ผ่านทุกชื่ออื่นที่ชี้ไปที่รายการเดียวกัน

Two variables a and b both pointing at the same list object; appending to a is visible through b.

a และ b ทั้งคู่ชี้ไปที่รายการเดียวกัน การแก้ไขผ่านชื่อใดก็ตามจะเปลี่ยนสิ่งที่ชื่ออื่นทุกชื่อมองเห็น

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]                # same object, change is visible

หากต้องการสำเนาอิสระ ให้แบ่งส่วนรายการทั้งหมดหรือเรียกตัวสร้าง list:

>>> c = a[:]                # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4]                # c is unaffected

การดำเนินการนี้คัดลอกเฉพาะรายการ ระดับบนสุด เท่านั้น รายการที่ซ้อนกันยังคงใช้ร่วมกันระหว่างต้นฉบับและสำเนา