将字典值设置为变量,而不是变量的值

时间:2015-02-11 01:37:26

标签: python dictionary

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}

我正在尝试将变量的引用分配给字典值。我不想将变量的值赋给字典的值。有没有办法做到这一点?基本上,我希望最后一行阅读:

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

4 个答案:

答案 0 :(得分:1)

在我看来,这是你最接近python的地方:

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

答案 1 :(得分:0)

不,因为整数在Python中是不可变的。有关详细信息,请参阅Python data model。您只能更改字典值,如下所示:

A['a'] = 1

当您设置a = 1时,实际上是在创建一个 new a ,这就是它没有反映到词典中的原因。来自documentation

  

类型几乎影响对象行为的所有方面。甚至对象标识的重要性在某种意义上也受到影响:对于不可变类型,计算新值的操作实际上可以返回对具有相同类型和值的任何现有对象的引用,而对于可变对象,这是不允许的。例如,在a = 1之后; b = 1,a和b可能会或可能不会引用具有值1的同一对象,具体取决于实现,但在c = []之后; d = [],c和d保证引用两个不同的,唯一的,新创建的空列表。 (注意,c = d = []将同一个对象分配给c和d。)

答案 2 :(得分:0)

Python不支持引用。即使在函数中,所有方法参数都是按值传递的。您可以将可变数据结构传递给函数并修改数据结构,但您所描述的内容是不可能的。

答案 3 :(得分:0)

让我以一个不同的方式解释。希望如果您是python的新手,这将有所帮助:

让我使用列表对象(可变)来获取不同对象的不同ID。

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

到目前为止,我们获得了a and A['a']的相同ID。

现在让我们将另一个对象绑定到名称a

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

在上面的例子中,我将一个新的dict对象绑定到a并检查a and A['a']的身份,现在它们是不同的,因为名称a绑定到一个全新的对象

以下是引用计数的另一种解释:

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

在重新绑定到新名称后,您是否可以看到引用计数的减少,这意味着它是一个全新的对象绑定到a。所以,你不会'看看A的变化。

其他语言的变量赋值是python中的名称绑定。