在通过键调用该变量时,如何修改字典中值的变量?

时间:2015-09-01 04:59:42

标签: python-3.x dictionary

n = 3

d = {'x':n}

d['x'] += 1

print(n)

当我运行它时,我得到了

3

如何让n = 4?

2 个答案:

答案 0 :(得分:1)

至少,你不能以任何简单的方式做到这一点。

当您处理绑定到同一对象的两个变量时,问题非常相似。如果使用赋值重新绑定其中一个,则不会通过另一个变量看到新值:

a = 3
b = a
a += 1 # binds a to a new integer, 4, since integers are immutable
print(b) # prints 3, not 4

一个例外是,如果您没有将新值绑定到变量,而是就地修改可变对象。例如,如果您使用单元素列表1代替[1],则可以替换单个值而不创建新列表:

a = [3]
b = a
a[0] += 1 # doesn't rebind a, just mutates the list it points to
print(b[0]) # prints 4, since b still points to the same list as a

因此,对于您的字典示例,您可以采用类似的方法并使n和您的字典值成为您就地修改的列表或其他容器对象。

或者,您可以将变量名称"n"存储在词典中,然后在其他代码中替换它,而不是在globals词典中进行查找:

n = 3
d = {"x": "n"} # note, the dictionary value is the string "n", not the variable n's value
globals()[d["x"]] += 1
print(n) # this actually does print 4, as you wanted

这当然非常尴尬,只有当n是一个全局变量时才有效(你不能在函数中使用名义上等同的locals调用,因为修改字典由locals返回并不会更改局部变量)。我不推荐这种方法,但我想表明它可以完成,如果只是非常糟糕。

答案 1 :(得分:0)

您可以使用类来包含数据值以启用添加。基本上,您正在创建一个可变对象, 作为整数。 这是一种解决方法,但可以让你完成你想要的任务。

请注意,您可能需要覆盖更多Python运算符才能获得完全覆盖:

class MyInt(object):
    val = 0
    def __init__(self,val):
        self.val = val
    def __iadd__(self,val):
        self.val = self.val + val
    def __repr__(self):
        return repr(self.val)
n = MyInt(3)

print(n)
d = {'x':n}

d['x'] += 1

print(n)