如何不改变外在价值?

时间:2015-11-25 17:37:09

标签: python arrays list function scope

我是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

换句话说,我想把整个字典保留在外部函数中。 实际上我想知道为什么外部值会改变,如果我们只更改内部函数的参数给出的字典?

1 个答案:

答案 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不受伤害。