首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代可迭代控制列表

迭代可迭代控制列表
EN

Stack Overflow用户
提问于 2015-05-08 08:39:38
回答 2查看 33关注 0票数 0

我本以为会有以下情况:

代码语言:javascript
复制
a = [[1],[2],[3]]
for i in a:
    i = "x"
print(a)

给予:

代码语言:javascript
复制
["x","x","x"]

但是a实际上保持不变。为什么会这样呢?我认为i只是一个指向数组的指针。i是什么?当然,对于循环的第一次迭代,它不是1的副本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-08 08:40:42

代码语言:javascript
复制
a = [[1],[2],[3]]
for i in range(0, len(a)-1):
    a[i] = 'X'
print(a)

之所以如此,是因为您正在“选择”数组中每个对象的副本,作为循环中称为i的独立项。

代码语言:javascript
复制
a = [[1],[2],[3]]
for copiedItem in a:
    copiedItem = 'x' # Replaces your copy that you just picked out from a.

这意味着您要替换项目的副本,而不是数组/列表中的实际项。您需要通过索引a[<index>]来替换,以便替换列表中的项。

另一个例子是:

代码语言:javascript
复制
a = ['moo', 'cow', 'cat']
myCopy = a[0] # Copies 'moo' into 'myCopy'
myCopy = 'THE DEVIL' # Replaces 'moo'.. over your copy..

print(a)
['moo', 'cow', 'cat']

print(myCopy)
'THE DEVIL'

这可能是一个糟糕的例子,但它基本上做了同样的事情,只是for循环是列表对象的迭代生成器,它以异步return yield的形式返回每个项。每个返回的项只是一个副本,而不是对初始对象的引用,因此与复制a[0] :)是一回事。)

票数 2
EN

Stack Overflow用户

发布于 2015-05-08 09:00:35

从指针的角度考虑Python可能会产生误导。相反,您需要学习从对象绑定到名称的角度来思考。

所以

代码语言:javascript
复制
for i in a:

依次将名称i绑定到可迭代对象a中的每个对象,在本例中,这些对象是单个元素列表。

然后

代码语言:javascript
复制
    i = "x"

将文字字符串对象"x"绑定到名称i,该名称覆盖了以前的绑定,因此它对a或其内容没有任何影响。

请注意,

代码语言:javascript
复制
>>> for i in a:
...     i[0] = "x"
... 
>>> print a
[['x'], ['x'], ['x']]

做您(可能)期望的事情,因为i[0] = "x"正在修改当前绑定到i的列表,所以它没有将一个新对象绑定到i

关于这个主题的一个很好的指南是Ned的关于Python名称和值的事实和神话

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30119401

复制
相关文章

相似问题

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