这里有几个列表:a,b等我想分别对它们进行一些更改,但我对for循环的行为感到困惑.
例如:如果我们这样做
a, b = range(5), range(5,10)
for x in [a, b]: x += [0]
print(a,b)
Run Code Online (Sandbox Code Playgroud)
我们得到
([0, 1, 2, 3, 4, 0], [5, 6, 7, 8, 9, 0])
Run Code Online (Sandbox Code Playgroud)
a,b被修改.
但如果我们这样做
a, b = range(5), range(5,10)
for x in [a, b]: x = x + [0]
print(a,b)
Run Code Online (Sandbox Code Playgroud)
我们得到
([0, 1, 2, 3, 4], [5, 6, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)
a,b未被修改.我很困惑,x和a之间的关系是什么?我何时或如何修改a的值?顺便说一句,a + = b和a = a + b之间有什么区别?
无论如何,我找到了一个我们可以这样做的解决方案
a, b = range(5), range(5,10)
lis = [a, b]
for i, x in enumerate(lis):
lis[i] = ...
Run Code Online (Sandbox Code Playgroud)
然后我们可以修改a&b的值.但是这种方法需要做一个额外的清单.
还有另一个解决方案
for x in ['a', 'b']:
exec(x + '=' + x + '+ ...')
Run Code Online (Sandbox Code Playgroud)
更简单的解决方案
a, b = range(5), range(5,10)
for x in [a, b]: x[:] = x + [0]
print(a,b)
Run Code Online (Sandbox Code Playgroud)
我们会发现a,b被修改:)
该关系与Python中的所有变量绑定相同.名称绑定到值.您所看到的差异是因为您正在做不同的事情,有时候会对价值进行操作,有时会对名称进行操作.
对于列表,+=就地扩展列表 - 也就是说,它修改原始列表.因此,在使用列表的每个地方都可以看到修改.
执行此操作时x = x + [0],将名称重新绑定x到新列表(通过添加旧列表加上形成[0]).这不会修改原始列表,因此使用该列表的其他位置将看不到更改.
如果您在"变量","名称","值","按推荐呼叫"等搜索Python问题,您会发现其他有关此问题的讨论. 这是一个在函数 - 参数绑定的上下文中讨论类似问题的问题.for循环变量绑定的原理是相同的.