我有以下代码
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会有这样的行为?我完全理解第二个代码中发生的事情,但我不理解第一个代码的行为。你知道吗
在本规范中:
在循环中,
elem
被设置为L
中的每个值。然后你将elem
重新分配为不同的东西。所以它是L
中的值,然后它是另一个值。这不会影响L
中的值,因为elem
不是引用。你知道吗你可以把它写得更简洁:
科尔伍德给出了一个很好的答案(和往常一样),但我只想再补充几点。你知道吗
从传递值和传递引用等其他语言的概念来思考Python是如何工作的并没有多大帮助。与其考虑变量、变量的内容和指向变量的指针,不如试着采用Pythonic的观点,考虑对象与名称的绑定,以及对象(及其内容)是否可变。你知道吗
这些概念不仅对于理解在Python中调用函数时会发生什么非常重要,而且通常适用于简单的赋值。换言之,虽然赋值语句可能看起来像其他语言中的赋值语句,但实际发生的情况并不完全相同。你知道吗
Stack Overflow regular.Batchelder有一篇很棒的文章,里面有关于这个主题的可爱的图表:Facts and myths about Python names and values
下面是代码的一个变体,它改变了传递给它的列表。通常的Python约定是,改变对象的函数不返回它(尽管有时可以方便地改变该约定)。你知道吗
输出
相关问题 更多 >
编程相关推荐