为什么修改词典中的键还会修改分配给它们的数组? (蟒蛇)

问题描述 投票:1回答:1

我需要帮助理解当我将数组分配给字典的键时得到的结果,然后我修改了键并且数组也被修改了:

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的初学者,但对我来说这似乎并不简单。

python arrays list dictionary
1个回答
1
投票

my_list.append(my_dict)没有复制my_dictmy_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]之间的区别?

© www.soinside.com 2019 - 2024. All rights reserved.