Tại sao dấu phẩy được phép trong một danh sách?


135

Tôi tò mò tại sao trong Python một dấu phẩy trong danh sách là cú pháp hợp lệ và có vẻ như Python chỉ đơn giản bỏ qua nó:

>>> ['a','b',]
['a', 'b']

Nó có ý nghĩa khi một tuple kể từ ('a')('a',)là hai điều khác nhau, nhưng trong danh sách?



7
Dấu phẩy cũng được cho phép trong các danh sách trong C, C ++, Java, JavaScript, v.v.
Nayuki

Câu trả lời:


222

Ưu điểm chính là nó làm cho danh sách nhiều dòng dễ chỉnh sửa hơn và nó làm giảm sự lộn xộn trong các khác biệt.

Thay đổi:

s = ['manny',
     'mo',
     'jack',
]

đến:

s = ['manny',
     'mo',
     'jack',
     'roger',
]

chỉ liên quan đến thay đổi một dòng trong diff:

  s = ['manny',
       'mo',
       'jack',
+      'roger',
  ]

Điều này đánh bại sự khác biệt nhiều dòng khó hiểu hơn khi dấu phẩy bị bỏ qua:

  s = ['manny',
       'mo',
-      'jack'
+      'jack',
+      'roger'
  ]

Khác biệt thứ hai làm cho khó thấy rằng chỉ có một dòng được thêm vào và dòng kia không thay đổi nội dung.

Nó cũng làm giảm rủi ro khi làm điều này:

s = ['manny',
     'mo',
     'jack'
     'roger'  # Added this line, but forgot to add a comma on the previous line
]

và kích hoạt nối chuỗi theo nghĩa đen , tạo ra s = ['manny', 'mo', 'jackroger']thay vì kết quả dự định.


6
Điều này có ý nghĩa (nhất), nhưng tôi thực sự sẽ ngạc nhiên nếu trình phân tích cú pháp của ngôn ngữ được thiết kế để làm cho khác biệt dễ dàng hơn.
Burhan Khalid

94
@BurhanKhalid: Các nhà thiết kế ngôn ngữ là lập trình viên, và lập trình viên làm nhiều việc để làm cho cuộc sống của họ dễ dàng hơn.
Greg Hewgill

10
@Burhan Nếu bạn không tin lời giải thích đó, thì việc định nghĩa ngữ pháp theo cách đó cũng đơn giản hơn? ;) So sánh List = "[" {Item ","} "]".vớiList = "[" ({Item","}Item|)"]".
Voo

23
Điều này cũng giúp các chương trình khác dễ dàng tự động tạo mã hơn - việc in "\"item\","cho mỗi mục dễ dàng hơn nhiều so với việc in "\"item\""cho từng mục tiếp theo ","cho tất cả trừ mục cuối cùng.
Adam Rosenfield

9
@Voo Tôi cũng nghĩ như vậy nhưng ngữ pháp sau phải được xác định bằng mọi cách vì nó vẫn là một danh sách Python hợp lệ.
Alexander Suraphel

34

Đó là một quy ước cú pháp phổ biến để cho phép dấu phẩy trong một mảng, các ngôn ngữ như C và Java cho phép và Python dường như đã áp dụng quy ước này cho cấu trúc dữ liệu danh sách của nó. Nó đặc biệt hữu ích khi tạo mã để điền danh sách: chỉ cần tạo một chuỗi các phần tử và dấu phẩy, không cần phải xem phần cuối là trường hợp đặc biệt không nên có dấu phẩy ở cuối.


30

Nó giúp loại bỏ một loại lỗi nhất định. Đôi khi rõ ràng hơn để viết danh sách trên nhiều dòng. Nhưng trong, sau này bảo trì bạn có thể muốn sắp xếp lại các mục.

l1 = [
        1,
        2,
        3,
        4,
        5
]

# Now you want to rearrange

l1 = [
        1,
        2,
        3,
        5
        4,
]

# Now you have an error

Nhưng nếu bạn cho phép dấu phẩy và sử dụng chúng, bạn có thể dễ dàng sắp xếp lại các dòng mà không gây ra lỗi.


1
Điều này là gọn gàng, nhưng bạn có thể tránh điều này bằng cách chờ xử lý dấu phẩy. Tôi làm điều đó mọi lúc khi viết SQL
Burhan Khalid

38
Ngay cả khi bạn thêm dấu phẩy cho từng phần tử, bạn vẫn phải bỏ dấu phẩy trên phần tử đầu tiên.
Greg Hewgill

Một kẻ nói dối có thể bắt được điều này, không?
viki.omega9

6

Một tuple khác nhau vì ('a')được mở rộng bằng cách sử dụng tiếp tục ngầm định và ()s làm toán tử ưu tiên, trong khi ('a',)đề cập đến độ dài 1 tuple.

Ví dụ ban đầu của bạn sẽ là tuple('a')


('a'),là một chuỗi; nhưng quan điểm của tôi là dấu phẩy trong các bộ dữ liệu rất quan trọng, nhưng trong các danh sách chúng dường như chưa được Python chấp nhận.
Burhan Khalid

1
Họ âm thầm loại bỏ trong cả hai trường hợp, chỉ là trong một tuple, cần phải phân biệt nó với một chuỗi trong ngoặc.
richo

tuple('a')có lẽ là một ví dụ xấu, bởi vì nói chung tuple(x)(x,)không giống nhau. tuple('ab') != ('ab',). tuple('a') == ('a',)chỉ bởi vì 'a'là một chuỗi có độ dài 1.
chepner

Từ REPL: >>> ("a",) == ("a") Sai >>> ("ab",) == ("ab") Sai >>> ("ab", "bc",) == ("ab", "bc") Đúng
Seraphya

1

Lý do chính là để làm cho diff ít phức tạp hơn. Ví dụ: bạn có một danh sách:

list = [
    'a',
    'b',
    'c'
]

và bạn muốn thêm một yếu tố khác cho nó. Sau đó, bạn sẽ kết thúc việc này:

list = [
    'a',
    'b',
    'c',
    'd'
]

do đó, diff sẽ chỉ ra rằng hai dòng đã được thay đổi, đầu tiên thêm ',' phù hợp với 'c' và thêm 'd' ở dòng cuối cùng.

Vì vậy, python cho phép theo dõi ',' trong phần tử cuối cùng của danh sách, để ngăn chặn sự khác biệt thêm có thể gây nhầm lẫn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.