1

ばかげた質問をして申し訳ありませんが、完全な答えが見つかりません。

以下を使用します。

a_dict = {"A":0, "B":0}
def GetElementRef(index):
    return a_dict[index]
would_like_to_modify = GetElementRef("A")
would_like_to_modify = 2

これによりwould_like_to_modify、値は 2 になりますが、a_dict変更されません。

私の知る限り、割り当てベースの操作would_like_to_modifyは参照を再配置するだけです。この間接的な方法で元の辞書要素を変更する方法はありますか?

辞書を直接参照することでこれを実装できる他の方法がいくつかあることは知っていますが、これが何らかの方法で実行できるかどうかに興味があります。

4

4 に答える 4

4

質問のコードの場合、辞書の値は数値であり、数値は不変であるため、答えは「いいえ」です。一方、値が変更可能な場合は、実際に変更できます。例えば:

a_dict = {"A":[0], "B":[0]}

def GetElementRef(index):
    return a_dict[index]

would_like_to_modify = GetElementRef("A")
print would_like_to_modify
> [0]

would_like_to_modify[0] = 2
print would_like_to_modify
> [2]
于 2012-05-10T02:37:04.560 に答える
0

a_dict[index] = "something" という標準的な方法を使わないのはなぜですか?

于 2012-05-10T02:39:49.927 に答える
0

オブジェクトへの参照がなければ、オブジェクトを変更することはできません。変更したいオブジェクト (辞書) への参照がないため、質問に対する答えはノーです。

ディクショナリ内のオブジェクト、変更可能な型であれば変更できますが (たとえば、ディクショナリ アイテムがリストの場合は変更できます)、ディクショナリ自体は変更できません。

于 2012-05-10T02:33:30.907 に答える
0

オブジェクトと変数を区別する必要があります。Python では、オブジェクトは、そのデータのメモリ表現と、その上で呼び出すことができるメソッドのテーブルを持つ「物理的な」エンティティです。一方、変数は単にオブジェクトへの参照であり、それ自体の物理的なアイデンティティはありません (たとえば、C とは異なり、ポインターは依然としてオブジェクトとは無関係にアドレスを取得できるものです)に指差す)。

それでは、投稿したコードを見てみましょう。あなたが言う時

a_dict = {"A":0, "B":0}

a_dict2 つのキーと値のペアに配置された他の 4 つのオブジェクトへの参照を含むディクショナリ オブジェクト があります。

あなたが言う時

def GetElementRef(index):
    return a_dict[index]
would_like_to_modify = GetElementRef("A")

現在would_like_to_modify、両方の値スロットの 1 つがa_dict同じオブジェクトを参照しています (数値が実際にはオブジェクトではないことは今のところ無視してください)。しかし、あなたが言うとき

would_like_to_modify = 2

変数が指す値を変更するのではなく、変数を別のオブジェクトに再バインドしています。would_like_to_modify

基本的に、変数が右辺値として使用される場合、変数はそれが参照するオブジェクトに透過的に置き換えられますが、左辺値として使用される場合は、= の右側のオブジェクトにバインドされます。同様に、 a_dict["A"] は参照であり、左辺値として使用される場合は別のオブジェクトに再バインドできますが、右辺値として使用される場合は参照する値に透過的に置き換えられます。経由でアクセスしたという事実a_dict["A"]は失われます。

重要な点は=、オブジェクトへの参照をバインドするという厳密に 1 つのことを行う演算子であるということです。上記の Óscar López が投稿したコードを見ると、次のようになります。

a_dict = {"A":[0], "B":[0]}

そして少し書き直します

num1 = 0
key1 = "A"
value1 = [num1]
num2 = 0
key2 = "B"
value2 = [num2]

a_dict = {key1 : value1, key2 : value2}

関連する 7 つのオブジェクト、不変の 2 つの整数、2 つの文字列、それぞれ 1 つの整数への参照を持つ 2 つの配列、キー スロット内の 2 つの文字列への参照、およびその値内の 2 つの配列への参照を持つ dict があることがわかります。スロット。次の対話型セッションは有益です。

In [1]: num1 = 0

In [2]: key1 = "A"

In [3]: val1 = [num1]

In [4]: num2 = 1

In [5]: key2 = "B"

In [6]: val2 = [num2]

In [7]: dict = {key1: val1, key2: val2}

In [8]: dict
Out[8]: {'A': [0], 'B': [1]}

In [9]: num1 = 4

In [10]: val1
Out[10]: [0]

In [11]: dict
Out[11]: {'A': [0], 'B': [1]}

In [12]: val1 = [6]

In [13]: dict
Out[13]: {'A': [0], 'B': [1]}

In [14]: val2[0] = 42

In [15]: val2
Out[15]: [42]

In [16]: dict
Out[16]: {'A': [0], 'B': [42]}
于 2012-05-10T03:06:28.890 に答える