Python 作为函数参数列出-已放弃修改

Python 作为函数参数列出-已放弃修改,python,function,reference,arguments,argument-passing,Python,Function,Reference,Arguments,Argument Passing,我有以下代码 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):
    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会以这种方式运行?我完全理解第二段代码中发生的事情,但我不理解第一段代码的行为。

在这段代码中:

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]
在此代码中:

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]
在此代码中:

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]
在此代码中:

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 Ned Batchelder有一篇很棒的文章,其中有关于此主题的可爱图表:

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

输出

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

赫尔伍德给出了一个很好的答案(和往常一样),但我只想补充几点

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

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

Stack Overflow regular Ned Batchelder有一篇很棒的文章,其中有关于此主题的可爱图表:

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

输出

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

赫尔伍德给出了一个很好的答案(和往常一样),但我只想补充几点

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

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

Stack Overflow regular Ned Batchelder有一篇很棒的文章,其中有关于此主题的可爱图表:

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

输出

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

赫尔伍德给出了一个很好的答案(和往常一样),但我只想补充几点

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

这些概念不仅对于理解在Python中调用函数时会发生什么非常重要,而且通常也适用于简单的赋值。换句话说,虽然赋值语句可能看起来像赋值语句