使一个dic项引用一个列表项?

时间:2011-08-12 12:35:43

标签: python

这是我的问题:

>>> 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)

我希望有人能更好地解决我的问题。提前谢谢!

编辑:

对不起,第一个代码示例有点太简单了。我的情况更像是上面的例子。

3 个答案:

答案 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所指出的:你不能引用原始值