首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >掌握现场操作的基本知识。

掌握现场操作的基本知识。
EN

Stack Overflow用户
提问于 2014-02-22 18:28:41
回答 6查看 69关注 0票数 1

所以..。

代码语言:javascript
复制
a = [2,3,4,5]

for x in a:
  x += 1

a = [2,3,4,5]

什么都没有。

但如果我..。

代码语言:javascript
复制
a[2] += 1
a = [2,3,5,5]

显然,我的头脑无法理解基本知识。print(x)只返回单元格内的整数,因此它应该简单地为每个列表单元格自动添加一个整数。什么是解决办法,什么是我没有把握的?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-02-22 18:35:33

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

代码语言:javascript
复制
for i in range(len(a)):
    x = a[i]
    x += 1

第二:

代码语言:javascript
复制
for x in a:
    x += 1      

这两个for循环对x做的事情完全一样。从第一个方面可以看出,更改x的值根本不改变a;在第二个方面也是如此。

正如其他人所指出的,理解列表是创建具有新价值的新列表的好方法:

代码语言:javascript
复制
new_a = [x + 1 for x in a]

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

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2014-02-22 18:32:48

在本例中,您定义了一个新变量x,它依次引用a的每个元素。您不能修改x引用的x,因为intint中是不可变的。当您使用+=运算符时,将创建一个新的intx引用这个新的int,而不是a中的那个。如果您创建了一个包装了一个classint,那么您可以使用您的循环,因为这个类的实例是可变的。(这不是必要的,因为Python提供了更好的方法来完成您想做的事情)

代码语言:javascript
复制
for x in a:
  x += 1

您想要做的是根据一个新列表生成一个新列表,并可能将其存储回一个。

代码语言:javascript
复制
a = [x + 1 for x in a]
票数 4
EN

Stack Overflow用户

发布于 2014-02-22 18:31:31

如果要对ints列表中的元素+1:

代码语言:javascript
复制
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是一个可变对象,+=可能会工作:

代码语言:javascript
复制
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]]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21958543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档