这是我的问题:
>>> row0 = [0, 0, 0]
>>> row1 = [0, 0, 0]
>>> field = {'hor' : (row0[0], row1[0])}
>>> field
{'hor': (0, 0)}
>>> row0[0] = 1
>>> field
{'hor': (0, 0)}
我真正想要的是:
>>> field
{'hor': (1, 0)}
我理解这种行为,但我怎么能破解它呢?
我能想到的唯一方法是:
我可以在字典中存储项目的ID,如下所示:
row0 = [0, 0]
row1 = [0, 0]
field = {'hor' : (id(row0[0]), id(row1[0]))}
但这里的问题是通过id访问变量(我只需要读访问权限)。我google了一下,我发现唯一可行的解决方案是使用globals()。items(),就像那样:
for key, value in globals().items(): print key, value, id(value)
我希望有人能更好地解决我的问题。提前谢谢!
编辑:
对不起,第一个代码示例有点太简单了。我的情况更像是上面的例子。
答案 0 :(得分:4)
更简单的方法Just Works:
>>> row = [0, 0, 0] # creating a list object
>>> field = {'row0' : row} # creating a dict with a reference to the list
>>> field # let's see...
{'row0': [0, 0, 0]} # ... looks like this
>>> row[0] = 1 # modifying the list through the name "row"
>>> field
{'row0': [1, 0, 0]} # ... hey, it got modified!
>>> field["row0"][1] = 2 # modifying the list through the dict
>>> row # let's see again...
[1, 2, 0] # ... hey, modified again!
在字典中存储对列表本身的引用,因此field["row0"]
和row
都是对同一列表对象的引用,因此修改一个将修改另一个。
答案 1 :(得分:1)
并不是说您无法通过引用访问“原始值”。问题是Python中的一些数据类型是可变的(列表,字典),而其他数据类型是不可变的(整数,字符串,元组)。每当您尝试修改不可变对象时,总是会返回具有新值的新对象。原始对象保持不变。所以......
a = 3 # create a new object with the value 3 and bind it to the variable 'a'
b = a # bind the variable 'b' to the same object as 'a'
这里'a'和'b'都在内存中的同一位置引用同一个对象。但是,因为对象是不可变的,修改'b'没有“预期的”结果......
b = 4
print a # displays "3"
我们这些来自C / C ++的人不习惯“不可变对象”。在C中,你会期望“b = 4”来修改b指向的“对象”,将其值设置为4.在Python中,情况并非如此。 “b = 4”创建一个值为4的新对象,并修改b以使其指向此新对象。
答案 2 :(得分:0)
正如Felix Kling所指出的:你不能引用原始值