Python 列表中的元组不能直接更改吗?

Python 列表中的元组不能直接更改吗?,python,list,tuples,Python,List,Tuples,在线课程有一个编程问题,要求我修改元组列表中的一项。奇怪,我知道。在研究堆栈溢出的其他一些问题时,评论者们注意到字典更有意义 但是,撇开数据结构不谈,以下代码不起作用: l = [(0, 'apples'), (1, 'pears'), (2, 'bananas')] for item in l: if item[0] == 1: item = 'something else' 没有。它保持不变。但当我以不同的方式编写循环时,如下所示: for index in ra

在线课程有一个编程问题,要求我修改元组列表中的一项。奇怪,我知道。在研究堆栈溢出的其他一些问题时,评论者们注意到字典更有意义

但是,撇开数据结构不谈,以下代码不起作用:

l = [(0, 'apples'), (1, 'pears'), (2, 'bananas')]

for item in l:
    if item[0] == 1:
        item = 'something else'
没有。它保持不变。但当我以不同的方式编写循环时,如下所示:

for index in range(len(l)-1):
    if l[index][0] == 1:
        l[index] = 'what is this'
列表中的中间项已成功更改,即使它是元组。我不喜欢第二段代码;这似乎是不必要的冗长。这两种方法都行吗?我正在考虑将此行为报告为Python中的一个bug(尝试了2.7和3.4)

在python中通常是这样做的

这不是一个bug

在第一个示例中,您使用
item='something other'
分配一个局部变量名。例如,
不再引用列表中的元组。这是一个新的变量

在第二个示例中,您正在替换列表中的元素(该列表是可变的)


请参阅Joran的答案,了解如何执行此操作。

如果要更改就地使用枚举不范围:

l = [(0, 'apples'), (1, 'pears'), (2, 'bananas')]

for ind, tup in enumerate(l):
    if tup[0] == 1:
        l[ind] = "something else"
print(l)
或者您可以使用带有列表理解的
l[:]
来更改原始列表:

l[:] = ["something else" if tup[0] == 1 else tup for  tup in l]

print(l) 
或使用生成器表达式:

l[:] = ("something else" if tup[0] == 1 else tup for  tup in l)

print(l)
item='something other'
只需创建一个变量
item
,实际索引列表
l[ind]
,并使用
=
分配一个新值即可更改列表中的项


只要列表中的中间项成功更改,即使它是一个元组,是的,这是预期的行为,您正在更改列表中的一个元素,而不是元组中的一个元素。如果尝试为元组编制索引并更新其中的值,则情况会有所不同,
TypeError:“tuple”对象不支持项分配
,因为元组是不可变的。

元组是不可变的immutable@PadraicCunningham我想他想替换列表中的项目(我知道名字不好)@JoranBeasley,你可能是对的,我只是看了一下标题;)如果使用循环进行更改,则应使用枚举。只有在第二个示例中,您才实际访问列表中的索引。第一个只是创建了一个变量项,该变量项等于
'something other'
伟大的答案。。。可能值得注意的是,在第一个示例中,它创建了一个局部变量项,然后被覆盖,这不会更改列表中的原始项(正如所暗示的,但可能需要真正解释清楚)@JoranBeasley澄清:)
l[:]使用列表理解来更改原始列表
。。。有点:P(+1)@JoranBeasley,
id
前后都会保持不变,对我来说已经足够好了;)我知道你知道其中的细微差别:P。。。我只是巧妙地指了指一只小手magic@JoranBeasley,我能说什么?我是看着保罗·丹尼尔斯长大的;)
l[:] = ("something else" if tup[0] == 1 else tup for  tup in l)

print(l)