user1217458
user1217458

Reputation: 21

Set dictionary value to a variable, not the variable's value

In [1]: a = None
In [2]: b = None
In [3]: A = {'a': a, 'b': b}
In [4]: A
Out[4]: {'a': None, 'b': None}
In [5]: a = 1
In [6]: A
Out[6]: {'a': None, 'b': None}

I am trying to assign a reference to a variable to a dictionary value. I don't want to assign the variable's value to the dictionary's value. Is there someway to do this? Basically, I would want the last line to read:

{'a': 1, 'b': None}

Upvotes: 0

Views: 89

Answers (4)

James Sapam
James Sapam

Reputation: 16940

Let me explain in a little different way. Hope this will be helpful if you are new to python:

Let me use a list object(mutable) to get different id for different object.

>>> a = [1]
>>> id(a)
4405572168
>>> A = {'a': a}
>>> id(A['a'])
4405572168
>>>

So far we got the same id of the a and A['a'].

Now lets bind another object into the name a

>>>
>>> a = {1: 2}
>>> id(a)
140196067104096
>>> id(A['a'])
4405572168
>>>

In the above eg, i bind a new dict object into a and check the identity of a and A['a'] and now they are different as the name a is bind to a totally new object.

Here is another explanation with reference counting:

>>> a = [1]
>>> sys.getrefcount(a)
2
>>> A = {'a': a}
>>> sys.getrefcount(a)
3
>>>
>>> a = {1: 2}
>>> sys.getrefcount(a)
2
>>>

Can you see the decrease in reference counting after we re-bind to a new name, which means its a totally new object bind to a. So, you wont' see the changes on A.

Variable assignment in other language is Name binding in python.

Upvotes: 0

mihirj
mihirj

Reputation: 1219

This is the closest you will get with python in my opinion:

class myobj:
    def __init__(self):
        self.mystr=""

    @property
    def mystr(self):
        return self.mystr

    @mystr.setter
    def mystr(self, val):
        self.mystr=val

    def __repr__(self):
        return str(self)

    def __str__(self):
        return self.mystr

a = myobj()
a.mystr = 'a'

names={'a': a}

print names

a.mystr = 'b'

print names

Upvotes: 1

Kevin Ji
Kevin Ji

Reputation: 10489

Python has no support for references. Even in functions, all method parameters are pass-by-value. You can pass a mutable data structure into a function and modify the data structure, but what you describe is impossible.

Upvotes: 0

Selcuk
Selcuk

Reputation: 59184

No, because integers are immutable in Python. See Python data model for details. You can only change the dictionary value as in:

A['a'] = 1

When you set a = 1, you are actually creating a new a, which is why it does not reflected to the dictionary. From the documentation:

Types affect almost all aspects of object behavior. Even the importance of object identity is affected in some sense: for immutable types, operations that compute new values may actually return a reference to any existing object with the same type and value, while for mutable objects this is not allowed. E.g., after a = 1; b = 1, a and b may or may not refer to the same object with the value one, depending on the implementation, but after c = []; d = [], c and d are guaranteed to refer to two different, unique, newly created empty lists. (Note that c = d = [] assigns the same object to both c and d.)

Upvotes: 0

Related Questions