แปลว่าอะไร?


100

ฉันกำลังวิเคราะห์โค้ด Python และไม่รู้ว่าอะไร

pop = population[:]

หมายถึง. มันเป็นรายการอาร์เรย์ใน Java หรือเหมือนอาร์เรย์สองมิติหรือไม่?


1
ที่เกี่ยวข้องการล้างรายการทำได้โดยการทำเดลป๊อป [:] หรือป๊อป [:] = [] ไม่ใช่ pop.clear () .. (ตามที่คุณทำกับคำสั่ง)
Macke

การสนทนาที่ดีของ Python slice: stackoverflow.com/questions/509211/…
Scott C Wilson

@Macke: หมายเหตุ: สำหรับ Python 3.3 lists ให้clearและcopyวิธีการเทียบเท่ากับการทำdel mylist[:]หรือmylist[:]ตามลำดับ โดยทั่วไปแล้วไม่จำเป็นต้องใช้ลำดับที่เปลี่ยนแปลงได้ดังนั้นหากคุณอาจได้รับลำดับที่ผันแปรได้โดยพลการคุณต้องการยึดติดกับการดำเนินการตามส่วน แต่อย่างน้อยวิธีการที่ตั้งชื่อก็มีให้ใช้งานlistได้
ShadowRanger

@ShadowRanger ใช่ 9 ปีต่อมา :-)
Macke

คำตอบ:


112

มันเป็นตัวอย่างของสัญกรณ์สไลซ์และสิ่งที่ทำขึ้นอยู่กับประเภทของpopulation. ถ้าpopulationเป็นรายการบรรทัดนี้จะสร้างสำเนาตื้นของรายการ สำหรับอ็อบเจ็กต์ประเภทtupleหรือ a strจะไม่ทำอะไรเลย (บรรทัดจะทำเช่นเดียวกันโดยไม่มี[:]) และสำหรับอาร์เรย์ NumPy (พูด) จะสร้างมุมมองใหม่สำหรับข้อมูลเดียวกัน


14
ในกรณี: ชิ้นส่วนส่งคืนสำเนาตื้น
André Caron

4
@ilius: อาจl.copy()จะอ่านได้มากกว่า แต่มันใช้ไม่ได้
Sven Marnach

13
list(l)ใช้งานได้เสมออ่านง่ายขึ้นและรับประกันว่าจะส่งคืนสำเนาแม้จะมีบางอย่างเช่นnumpy.array
Rosh Oxymoron

1
@Eli: list.clear()ใช่ข้าง แม้ว่าจะต้องใช้เวลาสักระยะหนึ่งกว่าจะนำไปสู่การลดคำถามประเภทนี้ใน SO ได้อย่างมีนัยสำคัญ :)
Sven Marnach

1
@MichaelGraczyk: ฉันคิดว่าคุณกำลังพูดถึงอาร์เรย์ NumPy ที่นี่ แทนที่จะใช้A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)]ฉันมักจะชอบnumpy.rollaxis(A, axis, 0)[k]มากกว่า โดยทั่วไปแล้วฉันไม่ค่อยเจอกรณีการใช้งานที่คุณต้องสร้างslice()วัตถุโดยตรง หากคุณต้องการพวกเขาอยู่แล้ว NumPy มีตัวs_ช่วยเป็นทางเลือกในการสร้างพวกเขา
Sven Marnach

29

นอกจากนี้ยังอาจช่วยให้ทราบว่าส่วนของรายการโดยทั่วไปจะทำสำเนาส่วนหนึ่งของรายการ เช่นpopulation[2:4]จะส่งคืนรายการที่มีประชากร [2] และประชากร [3] (การแบ่งส่วนเป็นสิทธิ์เฉพาะ) ออกจากดัชนีซ้ายและขวาเนื่องจากpopulation[:]ค่าเริ่มต้นเป็น 0 และความยาว (ประชากร) ตามลำดับดังนั้นการเลือกรายการทั้งหมด ดังนั้นนี่เป็นสำนวนทั่วไปในการทำสำเนารายการ


15

ดี ... นี่ขึ้นอยู่กับบริบทจริงๆ ในที่สุดก็ผ่านsliceวัตถุ ( slice(None,None,None)) เพื่อวิธีใดวิธีหนึ่งดังต่อไปนี้: __getitem__, หรือ__setitem__ __delitem__(ที่จริงถ้าวัตถุมี__getslice__จะถูกใช้แทน__getitem__แต่ตอนนี้เลิกใช้แล้วและไม่ควรใช้)

ออบเจ็กต์สามารถทำสิ่งที่ต้องการได้ด้วยชิ้นส่วน

ในบริบทของ:

x = obj[:]

สิ่งนี้จะเรียกobj.__getitem__ด้วยวัตถุชิ้นที่ส่งผ่านในความเป็นจริงสิ่งนี้เทียบเท่ากับ:

x = obj[slice(None,None,None)]

(แม้ว่าแบบเดิมน่าจะมีประสิทธิภาพมากกว่าเพราะไม่ต้องค้นหาตัวsliceสร้าง - ทั้งหมดนี้ทำใน bytecode)

สำหรับวัตถุส่วนใหญ่นี่เป็นวิธีสร้างสำเนาตื้นของส่วนหนึ่งของลำดับ

ต่อไป:

x[:] = obj

เป็นวิธีการตั้งค่ารายการ (มันเรียก__setitem__) ตามobj.

และฉันคิดว่าคุณอาจเดาได้ว่า:

del x[:]

โทร ;-).

คุณยังสามารถส่งผ่านชิ้นต่างๆได้:

x[1:4]

โครงสร้าง slice(1,4,None)

x[::-1]

โครงสร้างslice(None,None,-1)และอื่น ๆ อ่านเพิ่มเติม: อธิบายสัญกรณ์ชิ้นส่วนของ Python



6

สร้างสำเนาของรายการเทียบกับการกำหนดชื่อใหม่สำหรับรายการที่มีอยู่แล้ว


5

[:]
ใช้สำหรับลิมิตเตอร์หรือการแบ่งส่วนในอาร์เรย์แฮช
เช่น
[1: 5] สำหรับการแสดงค่าระหว่าง 1 รวมและ 5 เอกสิทธิ์เช่น 1-4
[เริ่มต้น: สิ้นสุด]

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


1
ไม่มีเหตุผลที่จะตอบคำถามเก่า ๆ เช่นนี้ซึ่งมีคำตอบที่คล้ายกันอยู่แล้ว 5 คำตอบและแม้แต่คำถามที่ได้รับการยอมรับ ... นอกจากนี้a[1:5]ส่งกลับองค์ประกอบ 1-4 ไม่ใช่ 2-4
Skamah One

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