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)