Python'da köşeli parantez ve parantez içine alınmış listeler arasındaki fark nedir?


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

İkisi de geçerli mi? Bir sebepten dolayı tercih edilir mi?


3
Sadece FYI: (i for i in ...)ve arasında daha derin bir fark var [i for i in ...].
Rik Poggi

2
@RikPoggi Derin fark nedir? Lütfen biraz açıklayabilir misiniz?
qazwsx

11
Birincisi bir jeneratör ifadesi , ikincisi bir liste kavramadır . Bazı bilgileri burada bulabilirsiniz: Liste Anlama Resmi Ders Kitabı , PEP 289 . Ve burada bazı işletim sistemi sorularında: Jeneratör İfadeleri ve Liste Anlama , jeneratör anlama .
Rik Poggi

Yanıtlar:


275

Köşeli parantezler listelerken parantez tupeldir .

Bir liste değiştirilebilir, yani içeriğini değiştirebilirsiniz:

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

tuples olmasa da:

>>> 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'

Diğer ana fark, bir demetin yıkanabilir olmasıdır, yani diğer şeylerin yanı sıra bir sözlük anahtarı olarak kullanabilirsiniz. Örneğin:

>>> 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'

Birçok insanın işaret ettiği gibi, birlikte tuples ekleyebilirsiniz. Örneğin:

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

Bununla birlikte, bu tuplelerin değiştirilebilir olduğu anlamına gelmez . Yukarıdaki örnekte , iki tuple bağımsız değişken olarak toplanarak yeni bir tuple oluşturulur. Orijinal grup değiştirilmez. Bunu göstermek için aşağıdakileri göz önünde bulundurun:

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

Yine de, aynı örneği bir listeyle oluşturacak yolsaydınız da güncellenirdi:

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

1
farklılıkları listelemek için iyi ama basit örnekler. Teşekkürler!
Dr. Essen

8

İlginç bir fark:

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)

Yalnızca tek bir değer olsa bile bir virgül bir tuple içine dahil edilmelidir. örneğin (1,)yerine (1).


Teşekkür ederim. Aradığım şey buydu. Gördüğüm kodun bir (list1 + list2 + list3) vardı ve bir liste değil, bir liste döndürdü.
HuckIt

4

Bunlar liste değil, bir liste ve bir demet. Tuples hakkında Python dersinde okuyabilirsiniz . Listeleri değiştirebilmenize rağmen, bu tuples ile mümkün değildir.

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

Köşeli parantezlerin ve parantezlerin farklı olmasının bir başka yolu, köşeli parantezlerin bir liste kavramasını, [x for x in y]

Karşılık gelen parantez sözdizimi bir tuple üretecini belirtirken :(x for x in y)

Aşağıdakileri kullanarak bir grup kavrayışı elde edebilirsiniz: tuple(x for x in y)

Bakınız: Python'da neden grup kavrayışı yok?



2

Çevrelediği ürün virgül ile ayrılmış (ve )olan tuplekişiler tarafından kapalı, s [ve ]vardır lists.


1
"Yuvarlak" parantez içine alınmış hiçbir liste yok, bunlar tuples! Ama muhtemelen doğru olanı kastediyorsun. :P
Gandaro

1
(Ve) ile çevrelenen listeler tuples'tir .. Kafam karıştı, listeler mi yoksa tuples mi?
juliomalegria

@ julio.alegria Ben @FlopCoder edildi yazma ne demek düşünmek " Öğeler çevrelediği (ve )olan tuplelar, çevrelediği bu [ve ]olan listlar."
funroll
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.