2017-08-21 7 views
0

:知らない人のために新しいdictエントリを追加して、新しいリストではなくタプルを追加しますか? 「流暢パイソン」で、この謎からインスピレーションを受け

t = (1, 2, [3,4]) 
t[2] += [5, 6] 

、それはエラーが発生しますが、タプルを変更します。エラーなし、

  1. はなぜt[2].extend([5, 6])動作します:

    私は2つのことを理解していませんか?

    辞書に新しいエントリの挿入がエラーなしで動作しますなぜ
  2. t = (1, {}) t[1]["name"] = "bob"

+0

[リスト内のリストをタプル内に入れた場合、そのリストの内容を安全に変更できますか?](https://stackoverflow.com/q/26262813/2301450) – vaultah

+0

1.これは、 't [2]'に変換します。 2.辞書も変更可能であり、再度タプル要素に割り当てようとしていないためです。 – jonrsharpe

答えて

1

extendと辞書であなたがそれらを取得した後、オブジェクト自体を変異しているので、これは、タプルに代入しようとするよりもむしろ。

t[2] += [5, 6] 

実際に種類の同等明確に許可されていません

t[2] = t[2] + [5, 6] 

にあります。

しかし、 t[2].extend([5, 6])のみ(許可され __getitem__を使用して)アイテムを取得し、それを目的としている後で extendを使用する(これは、 __setitem__フードの下で呼び出し)。オブジェクトはまだ同じオブジェクトですが、ポインタが変更されていないと考えるかもしれません。

あなたのコメントのケースは興味深いものです。最初のステートメントb = t[2]でオブジェクトを取得してから、オブジェクトを既に変更してオブジェクト自体を変更しています。これにより、タプルの__setitem__が呼び出されることはありません。タプル要素を変更することができる理由については、dupeリンクを参照してください。

+0

しかし、私が 'b = t [2]'を実行してから 'b + = [5,6]'を実行すると、それもタプルを変更しています。 – SpazaM

+0

それは私が 'setitem'が欠けていたもの – SpazaM

関連する問題