我想知道是否有可能引用字典的特定键。
例如,如果我创建字典:
D={0:[1,2,3],1:['a','b','c']}
和对0列表的引用
ref_D_0=D[0]
我可以打印D dict的0键的值
print(ref_D_0)
# [1, 2, 3]
但是如果我修改D字典:
D[0]=[3,2,1]
print(D) # {0: [3, 2, 1], 1: ['a', 'b', 'c']}
然后ref_D_0仍给我D [0]的先前值
print(ref_D_0)
#[1, 2, 3]
我希望ref_D_0引用D [0]而不是复制它。 我是否误解了有关在python中引用的信息?
答案 0 :(得分:2)
当您写ref_D_0=D[0]
时,值ref_D_0
使用字典来查询其当前值(列表[1,2,3]
)。之后,它与字典没有任何关联,仅与它的0
键的值无关。如果更改那个列表*(例如D[0][1] = 5
),则ref_D_0
的值也会改变。但是,您没有。而是给分配一个新值。您所做的基本上等于
a = [1,2,3]
b = a # they point to the same list
a = [3,2,1] # they don't anymore
总而言之,您并没有误解。 ref_D_0
是指D[0]
中当前的对象,它不是副本。但是,如果该对象被替换了(而不是 changed ),则您的ref_D_0
仍然引用原始对象。
执行所需操作的唯一方法是拥有指向D[0]
的指针,但是python中没有这样的东西。
答案 1 :(得分:2)
ref_D_0
指的是特定对象。
D[0]
指的是同一对象。
D[0] = [3, 2, 1]
创建一个新对象,并使D[0]
引用它,替换原始对象。
这当然不会影响ref_D_0
。为什么要这样?
如果您要修改列表而不是在字典中替换列表,则可以append
,insert
,甚至分配给切片,例如D[0][:] = [3, 2, 1]
。这将影响ref_D_0
,因为它们都仍引用同一对象。
答案 2 :(得分:1)
执行ref_D_0=D[0]
时,使变量ref_D_0
指向当前保存在D[0]
的同一对象。
当您重新分配任何一个时,您都没有修改该对象,而只是修改了变量以引用另一个对象。
D[0]=[3,2,1]
现在D[0]
和ref_D_0
不再引用同一对象,因为您只是将D[0]
设置为引用其他对象。
例如,如果您修改对象而不是仅仅重新定义变量,则
D[0].append(0)
然后您将能够看到反映在ref_D_0
中的更改,因为这两个变量仍将引用同一对象。