n = 3
d = {'x':n}
d['x'] += 1
print(n)
当我运行它时,我得到了
3
如何让n = 4?
答案 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)