Listede neden sondaki virgüllere izin verilir?


136

Python'da listedeki son virgülün neden geçerli bir sözdizimi olduğunu merak ediyorum ve Python bunu basitçe görmezden geliyor gibi görünüyor:

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

O zamandan beri bir demet olması ('a')ve ('a',)iki farklı şey olması mantıklı , ama listelerde?



7
Sondaki virgül C, C ++, Java, JavaScript vb.
Listelerde de kullanılabilir

Yanıtlar:


224

Başlıca avantajları, çok satırlı listeleri düzenlemeyi kolaylaştırması ve farklardaki karmaşayı azaltmasıdır.

Değiştirme:

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

için:

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

farkta yalnızca bir satırlık değişiklik içerir:

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

Bu, sondaki virgül atlandığında daha kafa karıştırıcı olan çok satırlı farkı yener:

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

İkinci fark, yalnızca bir satırın eklendiğini ve diğer satırın içeriği değiştirmediğini görmeyi zorlaştırır.

Ayrıca bunu yapma riskini de azaltır:

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

ve amaçlanan sonuç yerine üreten, örtük dize değişmez birleştirme tetikleme s = ['manny', 'mo', 'jackroger'].


6
Bu, (en) mantıklı olanıdır, ancak dilin ayrıştırıcısı, farkları kolaylaştırmak için tasarlandıysa gerçekten şaşırırdım.
Burhan Khalid

94
@BurhanKhalid: Dil tasarımcıları programcıdır ve programcılar hayatlarını kolaylaştırmak için birçok şey yapar.
Greg Hewgill

10
@Burhan Bu açıklamaya inanmıyorsan, buna ne dersin dilbilgisini bu şekilde tanımlamak da daha kolay? ;) Karşılaştırma List = "[" {Item ","} "]".vsList = "[" ({Item","}Item|)"]".
Voo

23
Bu, diğer programların kodu otomatik olarak oluşturmasını da kolaylaştırır - "\"item\","her öğe için yazdırmak "\"item\"", her öğe için ardından ","son öğe hariç tümü için yazdırmaktan çok daha kolaydır .
Adam Rosenfield

9
@Voo Ben de aynı şeyi düşündüm ama son dilbilgisi yine de tanımlanmalı çünkü hala geçerli bir Python listesi.
Alexander Suraphel

34

Bir dizide son virgüllere izin vermek yaygın bir sözdizimsel kuraldır, C ve Java gibi diller buna izin verir ve Python, liste veri yapısı için bu kuralı benimsemiş görünüyor. Bir listeyi doldurmak için kod oluştururken özellikle kullanışlıdır: sadece bir dizi öğe ve virgül oluşturun, sonuncuyu sonunda virgül içermemesi gereken özel bir durum olarak düşünmeye gerek yok.


30

Belirli bir tür hatayı gidermeye yardımcı olur. Listeleri birden çok satıra yazmak bazen daha nettir. Ancak, daha sonraki bakımda, öğeleri yeniden düzenlemek isteyebilirsiniz.

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

# Now you want to rearrange

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

# Now you have an error

Ancak sondaki virgüllere izin verirseniz ve bunları kullanırsanız, bir hata oluşturmadan satırları kolayca yeniden düzenleyebilirsiniz.


1
Bu harika, ancak virgülün başında bekleyerek bundan kaçınabilirsiniz. Bunu SQL yazarken her zaman yapıyorum
Burhan Khalid

38
Her öğenin başına virgül koysanız bile, yine de ilk öğedeki virgülü atlamanız gerekir.
Greg Hewgill

Bir linter bunu yakalayabilmelidir, değil mi?
viki.omega9

6

Bir demet farklıdır çünkü ('a')örtük devamlılık kullanılarak genişletilir ve ()öncül operatörü olarak s, oysa('a',) uzunluk 1 demetini belirtir.

Orijinal örneğiniz şöyle olurdu tuple('a')


('a'),bir dizedir; ama benim açımdan, demetlerdeki sondaki virgüllerin önemli olduğu, ancak listelerde henüz Python tarafından kabul edilmediği görülüyor.
Burhan Khalid

1
Her iki durumda da sessizce atılırlar, sadece bir tuple içinde onu parantez içindeki bir dizeden ayırmak gerekir.
richo

tuple('a')muhtemelen kötü bir örnektir, çünkü genel olarak tuple(x)ve (x,)aynı şey değildir. tuple('ab') != ('ab',). tuple('a') == ('a',)sadece 'a'1 uzunluğunda bir dizi olduğu için
chepner

>>> ("a",) == ("a") >>> ("ab",) == ("ab") >>> ("ab", "bc",) == ("ab", "bc")
REPL'den

1

Temel neden, diff'i daha az karmaşık hale getirmektir. Örneğin bir listeniz var:

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

ve ona başka bir öğe eklemek istiyorsunuz. O zaman sonunda bunu yapacaksın:

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

bu nedenle, diff iki satırın değiştirildiğini gösterecektir, ilk olarak 'c' satırına ',' ve son satıra 'd' eklenir.

Bu nedenle, python, karışıklığa neden olabilecek fazladan farkları önlemek için listenin son öğesinde ',' izine izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.