我需要帮助理解当我将数组分配给字典的键时得到的结果,然后我修改了键并且数组也被修改了:
A = numpy.zeros((2,2))
a = 0
my_dict = {'key1':matrix([]), 'key2':0}
my_list = list()
for i in range(0,2):
my_dict['key1'] = A[i,:]
my_dict['key2'] = a
my_list.append(my_dict)
my_list[i]['key1'][0] = i+1
my_list[i]['key2'] = i+1
print(my_list)
[{'key2': 2, 'key1': array([ 2., 0.])}, {'key2': 2, 'key1': array([ 2., 0.])}]
print(A)
[[ 1. 0.] [ 2. 0.]]
print(a)
0
第一:为什么A
被修改而a
没有?
第二:为什么我需要在my_dict = {'key1':matrix([]), 'key2':0}
循环结束时写for
才能获得
[{'key2': 1, 'key1': array([ 1., 0.])}, {'key2': 2, 'key1': array([ 2., 0.])}]
我是Python的初学者,但对我来说这似乎并不简单。
my_list.append(my_dict)
没有复制my_dict
。 my_list
的所有元素都是对同一字典的引用,这是my_dict
的值。当您指定其键时,您将继续修改该dict。
你需要每次循环创建一个新的dict。
A = numpy.zeros((2,2))
a = 0
my_list = list()
for i in range(0,2):
my_dict = {}
my_dict['key1'] = A[i,:]
my_dict['key2'] = a
my_list.append(my_dict)
my_list[i]['key1'][0] = i+1
my_list[i]['key2'] = i+1
print(my_list)
为什么A得到修改而a没有?
因为分配给字典属性不会修改恰好引用相同值的其他变量。与A
的区别在于你正在修改数组元素my_list[i]['key1'][0] = i+1
,而不仅仅是分配给字典属性my_list[i]['key1']
。
通常,当您对可变对象(如列表,数组或字典)进行多次引用时,通过其中一个引用修改该对象的内容会更改对象本身,因此所有引用都会看到更改。但是,分配给引用只会更改一个引用。
一个更简单的例子:
a = [1, 2, 3]
b = a
a[0] = 10
b
[10, 2, 3]
a = [3, 2, 1]
b
[10, 2, 3]
你看到分配给a
和分配给a[0]
之间的区别?