lst = [(8, 7), (9, 6), (4, 8), (3, 5), (9, 4)]

for i in range(len(lst)):
    lst[i] = list(lst[i])

这很好用.

for i in lst:
    i = list(i)

但这不起作用.我不知道为什么?谁能告诉我原因吗?

推荐答案

Mutable Sequence Types(例如list)的文档解释了在序列s内将对象x分配给索引i处的项目,如下所示:

Operation: s[i] = x

Result:s中的第i项替换为x

这意味着代码读取lst[i] = list(lst[i])中的行将用list(lst[i]))替换lst中的项目ilist(lst[i]))是新创建的list,包含lst[i]引用的tuple的元素.

相反,请考虑您的代码阅读:

for i in lst:
    i = list(i)

for语句将lst的索引0处的项分配给变量i并执行语句i = list(i),然后在其下一次迭代中将lst的索引1处的项分配给i并再次执行语句i = list(i),依此类推,直到lst用完.

请注意:

  • for循环对变量i的赋值使i成为对lst中项目的引用

  • 由于lst中的每个项最初都是tuple,并且tupleimmutable sequence type,因此无法更改i引用的对象,因此无法使用i更改lst

    • Interesting side note:如果lst是列表列表(而不是元组列表),那么我们would可以使用i修改lst的项,例如:
    lst = [[8, 7], [9, 6], [4, 8], [3, 5], [9, 4]]
    for i in lst:
        i[:] = i + [0]
        i.append(1)
    print(lst)
    
    # Output:
    [[8, 7, 0, 1], [9, 6, 0, 1], [4, 8, 0, 1], [3, 5, 0, 1], [9, 4, 0, 1]]
    
  • list(i)从元组i创建list类型的新对象

  • i = list(i)将该新对象分配给变量i,使得i现在是对新创建的list对象的引用;i之前引用的对象,即lst中的tuple项,作为lst中的一项保持不变.

Python相关问答推荐

如果条件为真,则Groupby.mean()

根据不同列的值在收件箱中移动数据

如何使用pandasDataFrames和scipy高度优化相关性计算

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

pyscript中的压痕问题

如何创建一个缓冲区周围的一行与manim?

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

ThreadPoolExecutor和单个线程的超时

索引到 torch 张量,沿轴具有可变长度索引

CommandeError:模块numba没有属性generated_jit''''

使用Python从rotowire中抓取MLB每日阵容

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

人口全部乱序 - Python—Matplotlib—映射

使用tqdm的进度条

Tensorflow tokenizer问题.num_words到底做了什么?

你能把函数的返回类型用作其他地方的类型吗?'

用由数据帧的相应元素形成的列表的函数来替换列的行中的值

两个名称相同但值不同的 Select 都会产生相同的值(discord.py)

关于数字S种子序列内部工作原理的困惑