这是一个有效的python行为吗?我认为最终结果应该是[0,0,0]并且id()函数应该在每次迭代时返回相同的值.如何使它成为pythonic,而不是使用枚举或范围(len(bar))?
bar = [1,2,3] print bar for foo in bar: print id (foo) foo=0 print id(foo) print bar
输出:
[1, 2, 3] 5169664 5169676 5169652 5169676 5169640 5169676 [1, 2, 3]
poke.. 21
首先,你不能重新分配循环变量,你可以,但这不会改变你迭代的列表.因此,设置foo = 0
不会更改列表,而只会更改局部变量foo
(恰好包含每次迭代开始时迭代的值).
接下来,小数字,像0
和1
内部保存在一个小整数对象池中(这是一个CPython实现细节,不一定是这种情况!)这就是为什么ID foo
在分配0
给它之后是相同的.id基本上0
是池中整数对象的id .
如果要在迭代时更改列表,遗憾的是必须按索引访问元素.因此,如果您希望保持输出相同,但[0, 0, 0]
最后,则必须迭代索引:
for i in range(len(bar)): print id(bar[i]) bar[i] = 0 print id(bar[i]) print bar
否则,它实际上是不可能的,因为只要将列表的元素存储在变量中,就会有一个单独的引用,它与列表中存储的链接无关.由于大多数这些对象都是不可变的,并且在为变量赋值时创建了新对象,因此您无法获得列表对更新的引用.
首先,你不能重新分配循环变量,你可以,但这不会改变你迭代的列表.因此,设置foo = 0
不会更改列表,而只会更改局部变量foo
(恰好包含每次迭代开始时迭代的值).
接下来,小数字,像0
和1
内部保存在一个小整数对象池中(这是一个CPython实现细节,不一定是这种情况!)这就是为什么ID foo
在分配0
给它之后是相同的.id基本上0
是池中整数对象的id .
如果要在迭代时更改列表,遗憾的是必须按索引访问元素.因此,如果您希望保持输出相同,但[0, 0, 0]
最后,则必须迭代索引:
for i in range(len(bar)): print id(bar[i]) bar[i] = 0 print id(bar[i]) print bar
否则,它实际上是不可能的,因为只要将列表的元素存储在变量中,就会有一个单独的引用,它与列表中存储的链接无关.由于大多数这些对象都是不可变的,并且在为变量赋值时创建了新对象,因此您无法获得列表对更新的引用.