4

次のように動作するように、「「x」という名前の変数が指している任意の変数」と int で読み取る参照が必要です。

>>> a = 1
>>> b = 2
>>> c = (a, b)
>>> c
(1, 2)
>>> a = 3
>>> c
(3, 2)

次のようにして、リストで同様のことができることを知っています。

>>> a = [1]
>>> b = [2]
>>> c = (a, b)
>>> c
([1], [2])
>>> a[0] = 3
>>> c
([3], [2])

しかし、要素の代わりに a または b を何かに割り当てるこれは簡単に失われる可能性があります。

これを行う簡単な方法はありますか?

4

6 に答える 6

4

いいえ、Python でこれを行う直接的な方法はありません。その理由は、スカラー値 (数値) とタプルの両方がimmutable だからです。c名前から不変値 ( tuple を使用した名前など) へのバインディングを確立すると、再割り当てを除いて、バインド先の値を変更することはでき(1, 2)ません。c

2番目の例では、タプル自体は不変ですが、可変値への参照が含まれていることに注意してください。そのため、タプルが変更されたように見えますが、タプルの ID は一定のままで、変更可能な部分だけが変更されています。

于 2010-10-03T22:33:03.387 に答える
2

最後から2番目の行を思いついた可能な解決策は、常にそれを破壊します。

a = 3

これにより、完全に新しいコンテンツが変数に割り当てられます。オブジェクトまたは何かのプロパティ(または、独自の例で行ったようにリスト内のキー)を表していない限りa、最初と最後の間に関係を持つことはできませんa

于 2010-10-03T22:37:56.400 に答える
2

現在の値をその場でタプルに配置する必要がある場合は、ラムダを使用できます。c を返すか使用するだけでなく、c を呼び出す必要がありますが、状況によっては許容される場合があります。このようなもの:

>>> a = 1
>>> b = 2
>>> c = lambda: (a, b)
>>> c()
(1, 2)
>>> a = 3
>>> c()
(3, 2)
于 2010-10-04T03:39:30.290 に答える
1

Pythonには、数値が不変であるだけでなく、ポインターがないために方法がありません。リスト内の値をラップすると、ポインターがあることをシミュレートするため、これが最善の方法です。

于 2010-10-03T23:41:38.480 に答える
1
class ByRefValue(object):
    def __init__(self, value):
        self.value = value

valueオブジェクト全体ではなくメンバーにアクセスする必要があることを覚えておいてください。


または、グローバル名前空間にある場合globals().get('a', 0)は の値を返しaます (そうでない場合はゼロ)。


ついに:

import threading
tls = threading.local()

tls.a = 1

tls必要なすべてのモジュールにインポートすると、a 各スレッドで同じ値にアクセスします。プログラムの設定方法に応じて、これは許容できる場合もあれば、理想的である場合もあれば、役に立たない場合もあります。

于 2010-10-04T03:49:14.410 に答える
0

独自のポインター クラスと独自のポインター ストレージ オブジェクトを作成して、システムの内部スタックをエミュレートすることができます。

于 2010-10-04T03:21:43.463 に答える