ความแตกต่างระหว่างรายการที่ล้อมรอบด้วยวงเล็บเหลี่ยมและวงเล็บใน Python คืออะไร?


174
>>> x=[1,2]
>>> x[1]
2
>>> x=(1,2)
>>> x[1]
2

พวกเขาทั้งสองถูกต้องหรือไม่ เป็นที่ต้องการด้วยเหตุผลบางอย่าง?


3
เพียง FYI: มีความแตกต่างที่ลึกซึ้งมากขึ้นระหว่างและ(i for i in ...) [i for i in ...]
Rik Poggi

2
@RikPoggi ความแตกต่างที่ลึกซึ้งคืออะไร? คุณช่วยอธิบายรายละเอียดได้ไหม?
qazwsx

11
คนแรกคือการแสดงออกกำเนิดและเป็นคนที่สองคือความเข้าใจในรายชื่อ คุณสามารถพบข้อมูลบางอย่างที่นี่: การสอนอย่างเป็นทางการในรายการความเข้าใจ , PEP 289 และที่นี่ในคำถาม OS บาง: Generator นิพจน์เทียบกับรายการความเข้าใจ , กำเนิดเข้าใจ
Rik Poggi

คำตอบ:


275

วงเล็บเป็นรายการในขณะที่วงเล็บคืออันดับ

รายการไม่แน่นอนซึ่งหมายความว่าคุณสามารถเปลี่ยนเนื้อหาได้:

>>> x = [1,2]
>>> x.append(3)
>>> x
[1, 2, 3]

ในขณะที่สิ่งอันดับ:

>>> x = (1,2)
>>> x
(1, 2)
>>> x.append(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'

ความแตกต่างที่สำคัญอื่น ๆ คือ tuple นั้นแฮชหมายความว่าคุณสามารถใช้มันเป็นกุญแจสำคัญในพจนานุกรมเหนือสิ่งอื่นใด ตัวอย่างเช่น:

>>> x = (1,2)
>>> y = [1,2]
>>> z = {}
>>> z[x] = 3
>>> z
{(1, 2): 3}
>>> z[y] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

โปรดทราบว่าคนจำนวนมากได้ชี้ให้เห็นคุณสามารถเพิ่มสิ่งอันดับด้วยกัน ตัวอย่างเช่น:

>>> x = (1,2)
>>> x += (3,)
>>> x
(1, 2, 3)

แต่ไม่ได้หมายความว่าสิ่งอันดับผันแปร ในตัวอย่างด้านบนtuple ใหม่ถูกสร้างขึ้นโดยการเพิ่มทั้งสอง tuples เป็นอาร์กิวเมนต์ tuple ดั้งเดิมไม่ได้ถูกแก้ไข หากต้องการสาธิตสิ่งนี้ให้พิจารณาสิ่งต่อไปนี้:

>>> x = (1,2)
>>> y = x
>>> x += (3,)
>>> x
(1, 2, 3)
>>> y
(1, 2)

โดยที่ถ้าคุณสร้างตัวอย่างเดียวกันนี้ด้วยรายการyก็จะได้รับการอัปเดตด้วย:

>>> x = [1, 2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]

1
ตัวอย่างที่ดีและเรียบง่ายเพื่อแสดงความแตกต่าง ขอบคุณ!
ดร. เอสเซน

8

ข้อแตกต่างที่น่าสนใจอย่างหนึ่ง:

lst=[1]
print lst          // prints [1]
print type(lst)    // prints <type 'list'>

notATuple=(1)
print notATuple        // prints 1
print type(notATuple)  // prints <type 'int'>
                                         ^^ instead of tuple(expected)

เครื่องหมายจุลภาคต้องรวมอยู่ใน tuple แม้ว่าจะมีเพียงค่าเดียว เช่นแทน (1,)(1)


ขอบคุณ. นี่คือสิ่งที่ฉันกำลังมองหา รหัสที่ฉันเห็นมี (list1 + list2 + list3) และมันส่งคืนรายการไม่ใช่ tuple
HuckIt

4

พวกเขาไม่ใช่รายการพวกเขาเป็นรายการและสิ่งอันดับ คุณสามารถอ่านเกี่ยวกับสิ่งอันดับในบทช่วยสอน Python ในขณะที่คุณสามารถกลายพันธุ์รายการนี้เป็นไปไม่ได้กับสิ่งอันดับ

In [1]: x = (1, 2)

In [2]: x[0] = 3
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/user/<ipython console> in <module>()

TypeError: 'tuple' object does not support item assignment

3

อีกวิธีหนึ่งที่แตกต่างกันคือวงเล็บและวงเล็บคือวงเล็บเหลี่ยมสามารถอธิบายความเข้าใจของรายการเช่น [x for x in y]

ในขณะที่ไวยากรณ์สอดสอดคล้องระบุขอบเขตของเครื่องกำเนิดไฟฟ้า :(x for x in y)

คุณสามารถทำความเข้าใจกับ tuple โดยใช้: tuple(x for x in y)

ดู: ทำไมไม่มีความเข้าใจสิ่งอันดับใน Python



2

รายการที่คั่นด้วยเครื่องหมายจุลภาคล้อมรอบด้วย (และ)เป็นtuples, รายการที่ล้อมรอบด้วย[และ]เป็นlists


1
ไม่มีรายการที่ล้อมรอบด้วยวงเล็บ "รอบ" พวกเขาเป็นสิ่งอันดับ! แต่คุณอาจหมายถึงสิ่งที่ถูกต้อง :P
Gandaro

1
รายการที่ล้อมรอบด้วย (และ) เป็นสิ่งอันดับ .. ฉันสับสนพวกเขาเป็นรายการหรือสิ่งอันดับ?
juliomalegria

@ julio.alegria ฉันคิดว่า @FlopCoder หมายถึงการเขียนคือ " รายการที่ล้อมรอบด้วย(และ)เป็นtuples, สิ่งที่แนบมาด้วย[และ]เป็นlists"
funroll
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.