所以......
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)
仅返回单元格中的整数,因此它应该只为每个列表单元格自动添加一个整数。什么是解决方案,我不能理解什么?
答案 0 :(得分:4)
在这种情况下,您要定义一个新变量x
,它依次引用a
的每个元素。您无法修改int
引用的x
,因为int
在Python中是不可变的。当您使用+=
运算符时,会创建一个新的int
,x
会引用这个新的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]