作者znmkhxrw (QQ)
看板Python
标题[问题] for x in iterator(variable) 问题
时间Sat Sep 23 16:50:19 2017
(Python 2.7)
想请问for loop的写法中, for x in iterator, 而这个iterator会随着loop而更动的话
规则是什麽?举例如下
(1)
k=10
for x in range(k):
print x,
k=k-1
------------------------------
console: 0 1 2 3 4 5 6 7 8 9
(2)
a=range(10)
for x in a:
print x
del(a[len(a)-1])
----------------------------
console: 0 1 2 3 4
这两个的都是每次loop中都会改到原始iterator的长相
为什麽系统就认为在(1)的case中:
range(k)=range(10) fixed
但是却在(2)的case中知道要每次都修正一次a
目前我只能说服自己说就这系统对於这两种写法有不同作为
请问有规则或其他解释吗?
谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.255.25.34
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1506156622.A.78D.html
1F:推 jamesxxx1997: 建议不要在回捐内原地修改 09/23 17:31
2F:推 jamesxxx1997: 可以改成 : 1. 建立新串列、放入想要的元素 09/23 17:34
j我知道有其他写法 只是我想知道不同的点XD
因为如果理解正确的话 这两个print出来要一样
现在不一样 一定有哪个地方理解错了@@
3F:推 Sunal: 1. in py27 type(range(x)) 是list 09/23 17:36
4F:→ Sunal: 在(1)里面 range(k) 就是 [0, 1, 2, ...] 09/23 17:37
5F:→ Sunal: loop里面改k自然没作用 09/23 17:38
S大 可是2.的case type(a)也是list耶
※ 编辑: znmkhxrw (111.255.25.34), 09/23/2017 17:42:11
6F:推 Sunal: 这在py3结果也是一样 09/23 17:40
7F:推 Sunal: 其实这两种caes 本来做的事情就不一样...... 09/23 17:47
8F:推 Sunal: k=k-1不会去改变list的长度阿 09/23 17:52
9F:推 wennie0433: 不一样的事情啊XD 09/23 18:00
10F:→ stucode: 在for回圈中,in後面的陈述式只会被求值(evaluated) 09/23 18:35
11F:→ stucode: 一次。在(1)之中,唯一的那一次就是首次进回圈呼叫 09/23 18:35
12F:→ stucode: range(k)求值,之後会利用求值结果[0, 1, ..., 8, 9] 09/23 18:35
13F:→ stucode: 来进行iteration,无论k在回圈中如何变化,range(k) 09/23 18:35
14F:→ stucode: 都不会再被呼叫第二次,也不会影响iteration的过程。 09/23 18:35
15F:推 bxxl: 楼上正解,range(k)执行一次後就与之後的k值无关 09/23 18:38
16F:→ bxxl: x in a这个被执行一次则会指向a的本体(不会创造副本) 09/23 18:39
17F:→ bxxl: 所以去修改a,就会影响loop行为 09/23 18:40
18F:推 jamesxxx1997: 谢谢bxxl大,受益良多XD 09/23 20:44
原本我也接受这说法 因为可以case1,2都过得去
但是刚刚试了:
a=range(10)
for x in a:
print x
a=[2,3]
我跟case2一样改变a
但是却跑出跟case1一样的结果.....
※ 编辑: znmkhxrw (111.255.25.34), 09/23/2017 20:51:59
19F:推 Sunal: 简单来说a只是指向range(10) loop里面只是把a改成指向[2,3] 09/23 21:45
20F:→ stucode: 就像楼上说的那样,a=[2,3]只是把名称a重绑定到一个 09/23 21:59
21F:→ stucode: 新的list[2, 3],原本的iterator不会因此受到影响。 09/23 21:59
22F:推 Sunal: 善用id() 就容易理解了 09/23 22:01
好 我试试看 谢谢你们的解释^^
※ 编辑: znmkhxrw (111.255.25.34), 09/23/2017 22:04:42
23F:→ znmkhxrw: 用id真的看出一些端倪 我再比较一下 09/23 22:12
24F:推 karta0910489: 推详细 上了一课 09/27 10:33