初学Python,有一定C/C++基础。
看到Tuple的"immutable"的时候产生了这样一个疑问。
根据我的理解,如果Tuple的元素是普通变量(e.g. myInt=5),那创建
myTuple=(myInt,)
的意义就是
myTuple=(myInt的值,)
因此是不变的。
但是如果myTuple=(myInt,myList),虽然myTuple[1]永远都指向myList,但是myList中的内容是可以改变的。看到有人表示这Tuple里的List实际上是myList的引用。那能否用C++的指针/引用来类比统一解释一下这种Tuple元素的immutable特性呢?
【补充一下:比如对于myTuple=(myInt,myList),定义的时候,从意义上感觉(非严谨),就像是用C++写:
myTuple[0]=myInt; //myInt之后发生了什么都和myTuple[0]无关了,myTuple[0]只决定于myInt当前值
&myTuple[1]=myList; //而myTuple[1]更像是myList的一个引用。myList如果变化,myTuple[1]也会变化
于是这里就产生了“同样是对Tuple赋值,却有两种不同的意义”的矛盾。有什么解释方式能调和这种矛盾么?】
表述的不太清楚,希望能有理解了我的疑问的朋友呀。多谢了。
あなたのたとえは間違っています。
リーリーmyTuple=(myInt,myList)
常時:Python ではすべてがオブジェクトなので、
myInt
もオブジェクトです。tuple
はimmutable
であり、その要素を再割り当てできないことを意味します。つまり、2 つのポインター変数myTuple[0]
とmyTuple[1]
の値は変更できないため、常にmyInt
とmyList
を指すことになります。これは確かです。ただし、オブジェクトが変更可能である必要がある場合、
tuple
の各要素が指すオブジェクト自体を変更できます。たとえば、myList
は変更可能なオブジェクトであるため、変更できます。しかし、myInt
は機能しません。整数も不変オブジェクトなので、変更することはできません。ポインタは、番号が書かれた小さな紙片として理解されます。紙に書かれた番号は、何かを取り出すためにどの番号の引き出しに行けばよいかを示します。
タプルは次のようになります:
myTuple を持っている場合、myTuple という名前のメモがあり、その番号に従って、引き出しの中に他の小さなメモが 1 つ以上入っている引き出しを見つけることができます。そして、これらの伝票の数は確実であり、伝票 myTuple を破棄する (または myTuple の番号を別の番号に置き換える) まで変更されない可能性があります。
myTuple が
(myInt,)
から(myInt, myList)
に変更されるプロセスは、実際には myTuple の番号を書き換え、新しい番号に対応する別の引き出しに 2 つのノートを入れます。最初のノートは元の myInt ノートです。 2 つ目は新しく追加された myList ノートです。myList に要素を追加または削除すると、実際には対応するドロワーに移動して、myList のメモに基づいて処理が行われます。これは、たまたま myTuple に番号が付いているだけです。 myTuple のメモ myTuple スリップの番号は同じです。
これは単なる定数ポインタです。
関数を使ってパラメータを渡すことで説明できると思います。
1. 変数オブジェクト参照: 関数の内部と外部の両方でオブジェクトへのポインタを保持します。オブジェクトが関数の内部と外部で使用される場合、関数内のオブジェクトを変更すると、参照による受け渡しと同様に、関数の外部でもオブジェクトが変更されます。
2. 不変オブジェクトのコピーの転送: 不変オブジェクトは元のメモリ空間では変更できないため、その値を変更したい場合、インタプリタは新しい変数を格納する新しいオブジェクトを作成します。このとき、使用されるオブジェクトが使用されます。関数の内側と外側のオブジェクトは同じではありません - 以前のオブジェクトは関数の外側でも使用されていますが、関数の内側ではまったく新しいオブジェクトが使用されています。
リーリー
まず、myList がアドレス (または参照、ポインタのようなものだと思います) を指すリスト オブジェクトであり、myTuple がこの参照を格納していることを確認します。 myList は可変であるため、追加と削除は可能ですが、そのアドレスは変更されていません。ID を 2 回確認してください。 myList が別のオブジェクトを指すと、アドレスが変更されます。この時点で変更された myList は myTuple には影響しません。 Tuple が保存したリスト オブジェクトは変更されていないため、myTuple とは関係ありません。
Python では、ここでの myInt は整数エンティティを指します。これは c/c++ とは異なります。このように、myInt は整数エンティティそのものであり、タプルに格納されます。は Quotation ですが、違いは Int が不変で List が可変であることです。
したがって、あなたが指摘した矛盾は存在しません。