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')
và ('a',)
là hai điều khác nhau, nhưng trong danh sách?
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')
và ('a',)
là hai điều khác nhau, nhưng trong danh sách?
Câu trả lời:
Ư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.
List = "[" {Item ","} "]".
vớiList = "[" ({Item","}Item|)"]".
"\"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.
Đó 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.
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.
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.
tuple('a')
có lẽ là một ví dụ xấu, bởi vì nói chung tuple(x)
và (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.
>>> ("a",) == ("a")
Sai >>> ("ab",) == ("ab")
Sai >>> ("ab", "bc",) == ("ab", "bc")
Đúng
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.