Python 为什么可以';此函数是否可以替换列表中的元素?

Python 为什么可以';此函数是否可以替换列表中的元素?,python,list,function,loops,lambda,Python,List,Function,Loops,Lambda,试着把5个都改成100个。我知道你应该使用列表理解,但为什么这不起作用?有人能从理论上解释吗?多谢各位 d = [5,1,1,1,5] def f1(seq): for i in seq: if i==5: i = 100 return seq print (f1(d)) 这一行: i = 100 给出局部变量i,该变量最初在seq中被赋值为100 要更改序列中的值,可以执行以下操作: for index, object in en

试着把5个都改成100个。我知道你应该使用列表理解,但为什么这不起作用?有人能从理论上解释吗?多谢各位

d = [5,1,1,1,5]

def f1(seq):
    for i in seq:
        if i==5:
            i = 100
    return seq

print (f1(d))
这一行:

i = 100
给出局部变量
i
,该变量最初在
seq
中被赋值为
100

要更改序列中的值,可以执行以下操作:

for index, object in enumerate(seq):
    if object == 5:
        seq[index] = 100
每次对序列调用Enumerate时,它都返回两个对象,即作为数字的索引和对象本身

请参阅列表和(Python 2)上的文档

你也可以写:

for index in range(len(seq)):
    if seq[index] == 5:
        seq[index] = 100

您可能更喜欢,但有时会被认为不太干净。

以以下示例为例:

def f1(seq):
    for i in seq:
        if i==5:
            i = 100
        # at this point (assuming i was 5), i = 100 but seq is still [3,5,7]
        # because i is not a reference to the item but the value *copied* from the list
    ...
f1([3,5,7])
您可以在索引中循环,并在列表中的该索引处设置值:

d = [5,1,1,1,5]

def f1(seq):
    for i in range(len(seq)):
        if seq[i]==5:
            seq[i] = 100
    return seq

print(f1(d))
# [100,1,1,1,100]

您应该更新列表中的元素,如下所示:

def f1(seq):
    for i in range(len(seq)): # run through the indexes of the list
        if seq[i]==5: # check whether seq at index i is 5
            seq[i] = 100 # update the list at the same index to 100

    return seq
i
是在循环中创建的新变量,因此它与列表中的元素引用不同

注意:

请注意,list是一个可变对象,因此在函数内部更改seq将影响list,即使在函数外部也是如此


您可以在

中了解有关可变和不可变的更多信息。Python赋值运算符将值绑定到名称。在每次迭代中,您的seq中i的循环
seq
中的值绑定到本地名称
i
i=100
然后将值
100
绑定到
i
。这不会影响原始序列,绑定将在循环的下一次迭代中再次更改

您可以使用列出索引以及
seq
的值,并以这种方式执行绑定:

def f1(seq):
    for n, i in enumerate(seq):
        if i == 5:
            seq[n] = 100
    return seq
更简单的方法可能是迭代索引:

def f2(seq):
    for n in range(len(seq)):
        if seq[n] == 5:
            seq[n] = 100
    return seq
上面显示的选项将在适当位置修改序列。除方便外,您无需退货。也有基于旧序列创建新序列的选项。然后可以重新绑定变量
d
,以指向新序列并删除旧序列

最简单、可能也是最具python风格的方法是使用列表理解:

d = [5, 1, 1, 1, 5]
d = [100 if x == 5 else x for x in d]
您还可以使用:


map
的输出是一个生成器,因此我将其包装在
list
中以保留相同的输出类型。这在Python 2中是不必要的,因为
map
已经返回了一个列表。

i
与序列中的一个项具有相同的值。但这是一个独立的变量。重新分配它不会影响序列。我是副本而不是实际副本item@VazgenTorosyan.
i
不是副本,它是对原始项目的引用,但它与列表无关。@Madphestics所以
i
与列表中的项目具有不同的id?@MrSoLoDoLo
i
最初与列表中的项目具有相同的
id
。但是当你说,
i=100
时,它现在将把
i
指向另一个对象(值为100的
int
)。列表中的引用仍将指向最初指向的值为5的
int
。很好地恢复了您的答案:)是的,我以前很困惑。。嗯,这是漫长的一天:)@MadPhysician
d = list(map(lambda x: 100 if x == 5 else x, d))