2014-09-25 82 views
-2

,当我在python变异列表只注意到了一句:变异列表在Python 2.7

my_list = ['a','b','c','d','e'] 

例1

for letter in my_list: 
    if letter == 'c': 
     letter = 'x' 

例2

for i in range(len(my_list)): 
    if my_list[i] == 'c': 
     my_list[i] = 'x' 

结果1

my_list = ['a','b','c','d','e'] 

结果2

my_list = ['a','b','x','d','e'] 

所以我的问题是,“信”不是直接提到“my_list”的元素? 两个循环之间有什么区别?

+2

你的第二个例子是没有意义的。请发布您的真实代码。 – Matthias 2014-09-25 08:58:27

+0

区别在于你的第二个循环不应该显示任何内容,因为字母不存在。 – 2014-09-25 09:00:37

+0

'a,b,c,d,e'是什么?那些字符串?而且在你的'if'语句中你也缺少':'。 – 2014-09-25 09:13:15

回答

0

假设其my_list[i]代替letter例如在2

在示例1中,当通过列表,并存储在变量letterfor letter in my_list,蟒迭代的值。所以,它就像是说letter = my_list[i]。现在您可以比较letter,但更改letter将不会更新my_list中的值,因为letter只是列表元素的副本。

+0

是的,我改变了第二个例子,那么letter是一个单独的变量,而不是一个引用。谢谢 – Tomy 2014-09-25 09:03:16

+0

是它只是单向绑定而不是双向 – hyades 2014-09-25 09:03:51

0

示例1中的字母是一个简单的变量,依次取每个列表元素的值。改变它根本不影响列表。我想在示例2中的“字母”应该替换为“list [i]”。在这种情况下,列表被修改。

我会写它的方式是:

my_list = ["x" if letter == "c" else letter for letter in my_list] 
+0

额外的内存使用! – hyades 2014-09-25 09:16:46

+0

@hyades:如果列表相当小,我不在乎在处理过程中。之后没有区别(只是新的列表内容能够存活),那么你指的是什么? – guidot 2014-09-25 09:29:12

+1

@hyades确实,我们正在抛弃第一份名单。但这是解决这个问题的pythonic方式。如果我在生产项目中看到类似于第二个示例的代码,我会要求他们将其更改为列表理解,如\ @guidot在此处所示。为了解决内存问题,如果可能的话,我可能会试图摆脱第一个列表(通过将其更改为迭代器),所以第一个列表首先不会存在。另外python列表不是数组,所以就地更新不会像你期望的那样好。 – yilmazhuseyin 2014-09-25 09:42:31