作为函数参数列出

2024-10-01 09:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码

def hidePasswords(L, password):
    for elem in L:
        if elem == password:
            elem = "*"*len(password)
    return L

print(hidePasswords(["test","test1","test8"],"test"))

它返回['test', 'test1', 'test8'],而不是['****', 'test1', 'test8']。当我把函数改为

def hidePasswords(L, password):
    temp = []
    for elem in L:
        if elem == password:
            elem = "*"*len(password)
        temp.append(elem)
    return temp

它工作正常。你知道吗

为什么Python会有这样的行为?我完全理解第二个代码中发生的事情,但我不理解第一个代码的行为。你知道吗


Tags: 代码intestforlenreturnifdef
2条回答

在本规范中:

def hidePasswords(L, password):
    for elem in L:
        if elem == password:
            elem = "*"*len(password)
    return L

在循环中,elem被设置为L中的每个值。然后你将elem重新分配为不同的东西。所以它是L中的值,然后它是另一个值。这不会影响L中的值,因为elem不是引用。你知道吗

你可以把它写得更简洁:

def hidePasswords(L, password):
    return ['*'*len(password) if elem==password else elem for elem in L]

科尔伍德给出了一个很好的答案(和往常一样),但我只想再补充几点。你知道吗

从传递值和传递引用等其他语言的概念来思考Python是如何工作的并没有多大帮助。与其考虑变量、变量的内容和指向变量的指针,不如试着采用Pythonic的观点,考虑对象与名称的绑定,以及对象(及其内容)是否可变。你知道吗

这些概念不仅对于理解在Python中调用函数时会发生什么非常重要,而且通常适用于简单的赋值。换言之,虽然赋值语句可能看起来像其他语言中的赋值语句,但实际发生的情况并不完全相同。你知道吗

Stack Overflow regular.Batchelder有一篇很棒的文章,里面有关于这个主题的可爱的图表:Facts and myths about Python names and values

下面是代码的一个变体,它改变了传递给它的列表。通常的Python约定是,改变对象的函数不返回它(尽管有时可以方便地改变该约定)。你知道吗

#! /usr/bin/env python

def hidePasswords(L, password):
    for i, elem in enumerate(L):
        if elem == password:
            L[i] = "*" * len(password)
    return

words = ["test", "test1", "test8"]
hidePasswords(words, "test")
print(words)

输出

['****', 'test1', 'test8']

相关问题 更多 >