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
什么?
迭代列表时,依次产生每个元素.但是,有不同种类的对象. 可变和不可变的.当你做类似的事情时:
a += 1
Run Code Online (Sandbox Code Playgroud)
使用不可变对象,它大致翻译为:
a = a + 1
Run Code Online (Sandbox Code Playgroud)
现在在这种情况下,您获取对象引用a
,向其添加1以创建新对象.然后为该新对象分配名称a
.注意如果我们在迭代时这样做,我们根本不触及列表 - 我们只是继续创建新对象并将它们分配给名称a
.
对于可变对象,这是不同的.然后a += 1
实际更改对象到位.因此,列表将看到更改,因为它所持有的对象已更改(已更改).(对于不可变对象,列表中包含的对象未被更改,因为它不可能).有关详细信息,请参阅此问题.
这也使得当你通过索引进行迭代时会发生什么变得更加清晰.你构造一个新的整数,你把它放在列表中(忘记之前的那个插槽).
归档时间: |
|
查看次数: |
161 次 |
最近记录: |