Pythonで角括弧と括弧で囲まれたリストの違いは何ですか?


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

どちらも有効ですか?何らかの理由で優先されますか?


3
参考までに:との間には、より深い違いが(i for i in ...)あり[i for i in ...]ます。
Rik Poggi、2012年

2
@RikPoggi大きな違いは何ですか?詳しく説明してもらえますか?
qazwsx 2012年

11
1つ目はジェネレータ式で、2つ目はリスト内包表記です。あなたはここにいくつかの情報を見つけることができます:リスト理解の公式チュートリアルPEP 289。そして、ここでいくつかのOSの質問:ジェネレータ式対リスト内包ジェネレータ-内包
Rik Poggi、2012年

回答:


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'

もう1つの主な違いは、タプルがハッシュ可能であることです。これは、特に、タプルを辞書のキーとして使用できることを意味します。例えば:

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

ただし、これはタプルが変更可能であることを意味しません。上記の例では、2つのタプルを引数として追加することにより、新しいタプルが作成されます。元のタプルは変更されません。これを実証するために、以下を検討してください。

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

1つの興味深い違い:

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)

値が1つしか含まれていない場合でも、コンマはタプルに含める必要があります。例えばの(1,)代わりに(1)


ありがとうございました。これは私が探していたものです。私が見たコードには(li​​st1 + list2 + list3)があり、タプルではなくリストを返しました。
HuckIt '19年

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

大括弧と小括弧が異なるもう1つの方法は、大括弧がリスト内包表記を記述できることです。例えば、 [x for x in y]

一方、対応する括弧構文はタプルジェネレータを指定します:(x for x in y)

以下を使用してタプル内包を取得できます。 tuple(x for x in y)

参照:Pythonにタプルの理解がないのはなぜですか?


2

1つ目はリスト、2つ目はタプルです。リストは変更可能ですが、タプルは変更できません。

見てくださいデータ構造のチュートリアルのセクション、およびシーケンス型のドキュメントのセクションを。


2

囲まれた項目をカンマ区切り ()しているtupleS、囲まれたもの[]されlist、S。


1
「丸」括弧で囲まれたリストはありません。それらはタプルです!しかし、あなたはおそらく正しいことを意味します。:P
ガンダロ2012年

1
(と)で囲まれたリストはタプルです..混乱しています。リストですか、タプルですか?
juliomalegria 2012年

@ julio.alegria私は@FlopCoderた書き込みにどのような意味だと思う「アイテムに囲まれた()しているtupleの、で囲まれたもの[]されているlistの。」
-funroll
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.