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中调用函数时会发生什么非常重要,而且通常也适用于简单的赋值。换句话说,虽然赋值语句可能看起来像赋值语句