关于python中的迭代器

Enz*_*nzo 4 python iterator loops

如果我有以下列表:

a = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

我运行以下代码:

for x in a:
  x += 1
Run Code Online (Sandbox Code Playgroud)

看来这不会改变列表a.

但是,如果我执行以下操作:

for i in range(0, len(a)):
  a[i] += 1
Run Code Online (Sandbox Code Playgroud)

这将修改'a'的内容.

所以我猜x并且以不同的方式a[i]指代元素a.究竟是什么导致了这种差异?他们每个人都指的是a什么?

mgi*_*son 5

迭代列表时,依次产生每个元素.但是,有不同种类的对象. 可变不可变的.当你做类似的事情时:

a += 1
Run Code Online (Sandbox Code Playgroud)

使用不可变对象,它大致翻译为:

a = a + 1
Run Code Online (Sandbox Code Playgroud)

现在在这种情况下,您获取对象引用a,向其添加1以创建新对象.然后为该新对象分配名称a.注意如果我们在迭代时这样做,我们根本不触及列表 - 我们只是继续创建新对象并将它们分配给名称a.

对于可变对象,这是不同的.然后a += 1实际更改对象到位.因此,列表将看到更改,因为它所持有的对象已更改(已更改).(对于不可变对象,列表中包含的对象未被更改,因为它不可能).有关详细信息,请参阅此问题.

这也使得当你通过索引进行迭代时会发生什么变得更加清晰.你构造一个新的整数,你把它放在列表中(忘记之前的那个插槽).