我是Python新手,因此我的问题看起来很愚蠢。 我尝试制作一些制作二维数组的程序。一个函数将项目放入列表并返回一个数组。然后,第二个函数放置第一个函数的结果并将其放在外部列表中。 我的程序看起来像这样:
def get_matrix():
d = some_dict
matrix = list()
while len(matrix)<3:
row = get_row(d)
matrix.append(row)
return matrix
def get_row(dict):
array = list()
for t in range(3):
a = dict.popitem()
array.append(a)
return array
some_dict = dict()
for x in range(9):
some_dict[x] = "a"+str(x)
print(some_dict)
print(get_matrix())
效果很好。但是如果我不想在外部函数中更改列表d但是只是这样做会怎么样:
def get_matrix():
d = some_dict
matrix = list()
while len(matrix)<3:
row = get_row(d)
matrix.append(row)
for x in row:
d.pop(x)
return matrix
换句话说,我想把整个字典保留在外部函数中。 实际上我想知道为什么外部值会改变,如果我们只更改内部函数的参数给出的字典?
答案 0 :(得分:2)
你正在内部函数中弹出dict的项目。由于您将一个可变对象(dict)的句柄传递给get_row()函数,因此弹出也会影响外部get_matrix中的dict。
请注意,作为复杂对象的dict在这方面的行为与不可变参数(int,float,str等)的行为不同。他们的价值观保持不变。
你可以传递你的词典副本
row = get_row(copy.deepcopy(d))
如下所述:Understanding dict.copy() - shallow or deep?。 顺便说一句,你可以访问你的dict中的值而不会弹出它们
def get_row(dict):
...
for t in range(3):
...
# a = dict.popitem()
a = dict[t]
这也将使dict不受伤害。