python 调用 args 中的另一个函数失败

python fails to call another function in args

我最近在研究一个简单的基本加密程序。 (在阅读问题之前跳过阅读代码

def generator():
    enckey="abcdefghijklmnopqrstuvwxyz"
    a=list(enckey)
    random.shuffle(a)
    c=''
    for i in a:
        c+=i
    c=c+a[0]
    return c


def senc(a,enckey=generator()):
    b=list(a)
    for i in range(0,len(a)):
        for j in range(0,27):
            if b[i]==enckey[j]:
                b[i]=enckey[j+1]
                break
    c=''
    for i in b:
        c+=i
    print("Encrypted text:",c,"\nEncryption Key:",enckey)

现在,当我调用函数 senc("argument") 时,它会生成一个 enckey 并使用它来加密提供的文本。现在,由于我说 enckey=generator() 我希望每次执行 senc 时它都会重新执行生成器以获取密钥。但这并没有发生。

证明如下:

>>> id(senc("Andy"))
Encrypted text: Arnj 
Encryption Key: htpkzwqlxcsdnregobvaimyjufh
1655676136
>>> id(senc("Candy"))
Encrypted text: Cirnj 
Encryption Key: htpkzwqlxcsdnregobvaimyjufh
1655676136

两者都在相同的内存地址,并且可以看出加密密钥是相同的。我哪里错了,为什么没有调用函数?

请注意,IDLE/commandprompt 的每个新实例的加密密钥都会发生变化,等等

默认参数仅在定义函数时计算一次。如果你想在每次调用不带 enckey 参数的函数时都有一个新的生成器,你应该这样做:

def senc(a,enckey=None):
    if enckey is None:
        enckey = generator()
    b=list(a)
    ...