[解決済み】なぜタプルはミュータブルアイテムを含むことができるのですか?
質問
もしタプルが不変であるなら、なぜ不変の項目を含むことができるのですか?
リストのような変更可能な項目が変更されても、それが属するタプルは不変であることを維持するのは一見矛盾しているように見えます。
どうすれば解決するの?
それは素晴らしい質問ですね。
重要な洞察は、タプルはその中のオブジェクトがミュータブルであるかどうかを知る術がないということです。 オブジェクトをミュータブルにする唯一のものは、そのデータを変更するメソッドを持つことです。 一般に、これを検出する方法はありません。
もうひとつの洞察は、Pythonのコンテナには実際には何も入っていない、ということです。 その代わり、他のオブジェクトへの参照を保持します。 同様に、Pythonの変数は、コンパイルされた言語の変数とは異なります。その代わりに、変数名は名前空間辞書の単なるキーで、対応するオブジェクトと関連付けられています。Ned Batchhelderはこのことを彼の ブログ記事 . いずれにせよ、オブジェクトは自分の参照カウントしか知りません。それらの参照が何であるか(変数、コンテナ、またはPython内部)は知りません。
この2つの洞察を合わせると、あなたの謎が解けます(なぜ不変のタプル "containing" a list が変更されると、そのリストが変更されるように見えるのか)。 実際、タプルは変化していません(他のオブジェクトへの参照は以前と同じままです)。 タプルは変化することができませんでした(変異するメソッドを持っていなかったからです)。 リストが変更されたとき、タプルは変更の通知を受けませんでした(リストは、それが変数によって参照されているのか、タプルなのか、それとも別のリストなのかわかりません)。
タプルとは何か、どのように機能するか、そしてその使用目的について、あなたのメンタルモデルを完成させるために、この話題に触れている間に、他のいくつかの考えを紹介しましょう。
-
タプルの特徴は、不変性よりも、その目的によって決まる。
タプルは、Pythonが異種の情報を1つの屋根の下に集めるための方法です。 例えばs = ('www.python.org', 80)
文字列と数字を組み合わせて、ホストとポートのペアをソケットとして渡せるようにしたもので、複合オブジェクトです。 このように考えると、Mutableなコンポーネントを持つことは非常に合理的です。 -
不死性は、別の性質と密接に関係しています。 ハッシュアビリティ . しかし、ハッシャビリティは絶対的な性質ではありません。 タプルの構成要素の1つがハッシュ化可能でない場合、タプル全体もハッシュ化可能ではありません。例えば
t = ('red', [10, 20, 30])
はハッシュ化できない。
最後の例は、文字列とリストを含む2タプルを示しています。タプル自体はミュータブルではありません(つまり、内容を変更するためのメソッドを持ちません)。 同様に、文字列はミューティングメソッドを持たないので、文字列はイミュータブルです。 リストオブジェクトはミューティングメソッドを持っているので、変更することができます。 このことは、ミュータビリティがオブジェクトの型の特性であることを示しています。あるオブジェクトはミューティングメソッドを持ち、あるオブジェクトは持ちません。 これは、オブジェクトが入れ子になっているからといって変わるものではありません。
2つのことを忘れないでください。 まず、不変性とは魔法ではなく、単に変異させるメソッドがないことです。 第二に、オブジェクトはどの変数やコンテナが自分を参照しているのかを知らない--参照カウントしか知らない。
お役に立ちましたでしょうか?)
関連
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] リストとタプルの違いは何ですか?
-
[解決済み] Pythonの「名前付きタプル」とは何ですか?
-
[解決済み] ある文字列が文字列のリストの項目の部分文字列であるかどうかを確認する方法は?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python カメの描画コマンドとその例
-
Python jiabaライブラリの使用方法について説明
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
Python Pillow Image.save jpg画像圧縮問題
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない