1

同じキーで辞書に繰り返しインデックスを付ける機能があります。問題のアイテムを参照することは可能ですか?

def my_function(self, event):
    self.__observers[event] ... #this is get is performed multiple times
    observer_ref = self.__observers[event] #can I make this a reference to the value?

更新: 目標は、自分自身にあるもののコピーをとらないことです。__observers[event]。私はC++に似た振る舞いを探しています。

int x = 1
int& y = x #reference to y, not a copy
4

3 に答える 3

3

Pythonで名前(変数)に値を割り当てる場合、変数は値への単なる参照です。

したがって、たとえばself.__observers[event]、空のリストとして開始すると、次のコードが正常に機能します。

assert self.__observers[event] == []
observer_ref = self.__observers[event]
observer_ref.append(1)                    # this modifies self.__observers[event]
assert self.__observers[event] == [1]

ただし、BrenBarnが指摘しているようにobserver_ref、新しい値を割り当てても、まったく変更self.__observers[event]されません。

于 2012-06-15T19:42:45.433 に答える
0

もちろん。やってみてみませんか?

ただし、コメントで指摘されているように、「参照」の意味によって異なります。提案したことを実行した場合、新しい変数に割り当ててもdictは変更されません。

>>> d = {'a': 1}
>>> d['a']
1
>>> x = d['a']
>>> x
1
>>> x = 2
>>> d
{u'a': 1}
于 2012-06-15T19:29:56.310 に答える
0

それは本当にあなたが「参照」によって何を意味するかに依存します。...そしてそれはあなたが参照で何をしようとしているのかにも依存します。例えば。

class Test(object):
    def __init__(self):
        self.__observers = {'event1': {'test':'this'}, 'event2': {'test':'that'}}

    def get_observers(self):
        return self.__observers

    def my_function(self, event):
        observer_ref = self.__observers[event]
        return observer_ref

if __name__ == '__main__':
    t = Test()

    my_event = 'event1'  

    print('From class: {}'.format(t.get_observers()[my_event]))
    my_ref = t.my_function(my_event)
    print('From my_function: {}'.format(my_ref))

    my_ref['something'] = 'else'

    print('From my_function after addition: {}'.format(my_ref))
    print('From class after addition: {}'.format(t.get_observers()[my_event]))

    my_ref = 'something else entirely'

    print('From my_function after re-assignment: {}'.format(my_ref))
    print('From class after re-assignment: {}'.format(t.get_observers()[my_event]))

結果:

From class: {'test': 'this'}
From my_function: {'test': 'this'}
From my_function after addition: {'test': 'this', 'something': 'else'}
From class after addition: {'test': 'this', 'something': 'else'}
From my_function after re-assignment: something else entirely
From class after re-assignment: {'test': 'this', 'something': 'else'}

基本的に、referenceある種のオブジェクトに対するものである場合は、その参照を使用してそのオブジェクトを操作できます。参照の名前を他の何かに再割り当てして、参照をプルした元のオブジェクトに反映させることはできません。

于 2012-06-15T19:43:08.450 に答える