掌握就地操作的基础知识

时间:2014-02-22 18:28:42

标签: python python-3.3

所以......

a = [2,3,4,5]

for x in a:
  x += 1

a = [2,3,4,5]

纳达。

但如果我......

a[2] += 1
a = [2,3,5,5]

显然,我的思想无法理解基础知识。 print(x)仅返回单元格中的整数,因此它应该只为每个列表单元格自动添加一个整数。什么是解决方案,我不能理解什么?

7 个答案:

答案 0 :(得分:4)

在这种情况下,您要定义一个新变量x,它依次引用a的每个元素。您无法修改int引用的x,因为int在Python中是不可变的。当您使用+=运算符时,会创建一个新的intx会引用这个新的int,而不是a中的class。如果您创建了一个包含int的{​​{1}},那么您可以按原样使用循环,因为此类的实例是可变的。 (这不是必需的,因为Python提供了更好的方法来做你想做的事情)

for x in a:
  x += 1

您要做的是基于a生成新列表,并可能将其存储回。

a = [x + 1 for x in a]

答案 1 :(得分:3)

要了解这里发生了什么,请考虑这两段代码。第一:

for i in range(len(a)):
    x = a[i]
    x += 1

第二

for x in a:
    x += 1      

这两个for循环与x完全相同。您可以从一开始就看到,更改x的值根本不会更改a;第二种情况也是如此。

正如其他人所说,列表理解是使用新值创建新列表的好方法:

new_a = [x + 1 for x in a]

如果您不想创建新列表,可以使用以下模式更改原始列表:

for i in range(len(a)):      # this gets the basic idea across
    a[i] += 1

for i, _ in enumerate(a):    # this one uses enumerate() instead of range() 
    a[i] += 1

for i, x in enumerate(a):    # this one is nice for more complex operations
    a[i] = x + 1

答案 2 :(得分:2)

如果您想对整数列表的元素+1:

In [775]: a = [2,3,4,5]

In [776]: b=[i+1 for i in a]
     ...: print b
[3, 4, 5, 6]

为什么for x in a: x += 1会失败?

因为x不可变的对象,无法就地修改。如果x是可变对象,则+=可能有效:

In [785]: for x in a:
     ...:     x+=[1,2,3] #here x==[] and "+=" does the same thing as list.extend

In [786]: a
Out[786]: [[1, 2, 3], [1, 2, 3]]

答案 3 :(得分:2)

当你说

for x in a:
  x += 1

Python只是在每次迭代时将名称x与来自a的项绑定。因此,在第一次迭代中,x将引用位于a的第0个索引中的项。但是当你说

x += 1

等同于

x = x + 1

因此,您将x的值加1,并使x引用新创建的数字(x + 1的结果)。这就是为什么更改在实际列表中不可见。

要解决此问题,您可以为每个元素添加1,如此

for idx in range(len(a)):
    a[idx] += 1

现在发生同样的事情,但我们正在用新元素替换索引i的旧元素。

<强>输出

[3, 4, 5, 6]

注意:但是我们必须尽可能地使用列表推导方法,因为它会保留原始列表,但会根据旧列表构建新列表。所以,同样的事情可以这样做

a = [item + 1 for item in a]
# [3, 4, 5, 6]

主要区别在于,我们之前对相同列表进行了更改,现在我们创建了一个新列表,并使a引用新创建的列表。

答案 4 :(得分:1)

在for循环中,您声明变量x

for x in a

这是你接下来添加一个的变量     x + = 1

然后你对x什么都不做。 如果您想稍后使用它,请将x保存在某处:)

答案 5 :(得分:1)

for 循环中的变量 x a 列表中每个单元格的副本。如果您修改 x ,则不会影响 a

更多&#34;正确&#34;将列表的每个元素递增一的方法是使用列表推导:

a = [elem + 1 for elem in a]

您也可以使用map功能:

a = map(lambda x: x + 1, a)

答案 6 :(得分:0)

当你输入[2]时,你指的是数组'a'中的第三个变量 因为在你的情况下为2的第一个元素同样存储在[0]中,3个存储在[1]中,4个存储在[2]中,5个存储在[3]