为什么参数值改变了?

时间:2019-04-29 08:54:39

标签: python python-3.x

这是我的代码:

def getGraphWave(G, d, maxk, p):
    data = dict()
    output_wavelets = {2:33,5:77,...}
    print(len(output_wavelets)) 
    k = [10,20]  
    for i in k:
        S = graphwave(i, output_wavelets)
        # size = avgSize(G, S, p, 200)
        size = IC(d, S, p)
        data[i] = size + i
    return data

output_wavelets是字典,其长度为2000。 但是,运行以下代码时:

def graphwave(k, output_wavelets):
    S = []
    print(len(output_wavelets))
    for i in range(k):
        Seed = max(output_wavelets, key=output_wavelets.get)
        S.append(Seed)
        output_wavelets.pop(Seed)
    return S

getGraphWave(G,D,maxk,p)中,graphWave(k,output_wavelets)在循环中运行两次。但是,为什么在graphWave()中,print(len(output_wavelets))的结果是2000和1991?
我认为output_wavelets之前没有更改。以及如何让output_wavelets始终是原始的?

2 个答案:

答案 0 :(得分:0)

首先,您需要了解python如何传递值。实际上,它取决于传递给函数的参数。 就像您传递列表,字典或任何可变对象一样。它可以在函数中进行修改。 但如果您传递元组,字符串或任何不可变的对象,则不会改变。

根据您的情况,您可以复制现有字典,然后对其进行修改。像

CREATE TABLE security_user ( id INT AUTO_INCREMENT NOT NULL, email VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_52825A88E7927C74 (email), PRIMARY KEY(id) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB

答案 1 :(得分:0)

当您调用graphwave(i, output_wavelets)时,会将 output_wavelets的引用传递给函数,而不是output_wavelets的副本。这意味着,当函数修改output_wavelets字典时,它就是在修改原始字典。

output_wavelets.pop(Seed)行会从字典中删除项目,因此也会修改您传入的output_wavelets字典。这就是为什么它会变小的原因!

有多种方法可以解决此问题。最简单(但可能不是最有效)的方法是使用copy.copy()函数在graphwave函数的开头创建字典的副本,然后编辑副本而不是原始副本。