Python 为什么可以';此函数是否可以替换列表中的元素?
试着把5个都改成100个。我知道你应该使用列表理解,但为什么这不起作用?有人能从理论上解释吗?多谢各位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
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?@MrSoLoDoLoi
最初与列表中的项目具有相同的id
。但是当你说,i=100
时,它现在将把i
指向另一个对象(值为100的int
)。列表中的引用仍将指向最初指向的值为5的int
。很好地恢复了您的答案:)是的,我以前很困惑。。嗯,这是漫长的一天:)@MadPhysician
d = list(map(lambda x: 100 if x == 5 else x, d))