在python中,what';当我们对循环执行时,循环变量和列表中的元素之间的关系是什么?

在python中,what';当我们对循环执行时,循环变量和列表中的元素之间的关系是什么?,python,for-loop,Python,For Loop,这里有几个列表:a、b等 我想分别对它们进行一些更改,但我对for循环的行为感到困惑 例如: 如果我们这样做 我们得到 ([0, 1, 2, 3, 4, 0], [5, 6, 7, 8, 9, 0]) ([0, 1, 2, 3, 4], [5, 6, 7, 8, 9]) a、 b是修改的 但如果我们这样做了 a, b = range(5), range(5,10) for x in [a, b]: x = x + [0] print(a,b) 我们得到 ([0, 1, 2, 3, 4, 0

这里有几个列表:a、b等 我想分别对它们进行一些更改,但我对for循环的行为感到困惑

例如: 如果我们这样做

我们得到

([0, 1, 2, 3, 4, 0], [5, 6, 7, 8, 9, 0])
([0, 1, 2, 3, 4], [5, 6, 7, 8, 9])
a、 b是修改的

但如果我们这样做了

a, b = range(5), range(5,10)
for x in [a, b]: x = x + [0]
print(a,b)
我们得到

([0, 1, 2, 3, 4, 0], [5, 6, 7, 8, 9, 0])
([0, 1, 2, 3, 4], [5, 6, 7, 8, 9])
a、 b没有修改。 我很困惑,x和a之间的关系是什么?何时或如何使用x修改a的值? 顺便问一下,a+=b和a=a+b的区别是什么

不管怎样,我找到了一个解决办法,我们可以这样做

a, b = range(5), range(5,10)
lis = [a, b]
for i, x in enumerate(lis): 
    lis[i] = ...
然后我们可以修改a和b的值。但是这种方法需要额外列出一个列表

还有另一种解决办法

for x in ['a', 'b']:
    exec(x + '=' + x + '+ ...')
一个更简单的解决方案

a, b = range(5), range(5,10)
for x in [a, b]: x[:] = x + [0]
print(a,b)

我们将发现a、b被修改:)

关系与Python中的所有变量绑定相同。该名称已绑定到该值。您看到的差异是因为您正在做不同的事情,有时是对值进行操作,有时是对名称进行操作

对于列表,
+=
就地扩展列表,即修改原始列表。因此,在使用列表的任何地方都可以看到修改

执行
x=x+[0]
操作时,将名称
x
重新绑定到新列表(通过添加旧列表加上
[0]
形成)。这不会修改原始列表,因此使用该列表的其他地方不会看到更改

如果您搜索Python中关于“变量”、“名称”、“值”、“引用调用”之类的问题,您将找到关于这方面的其他讨论。是一个在函数参数绑定上下文中讨论类似问题的问题。for循环变量绑定的原则相同。

行:

x += something
在执行以下操作时,就地更改列表:

x = x + something
通过加入
x
something
创建一个全新的列表

这与下面的简化演示没有什么不同:

>>> a = [7]      # The object is [7], name a is connected to it.
>>> x = a        # Now name x is also connected.
>>> x += [2]     # Here we change the backing object (behind a AND x).
>>> a            # So that both names seem to change.
[7, 2]
>>> x
[7, 2]

>>> a = [7]      # The object is [7], name a is connected to it.
>>> x = a        # Now name x is also connected.
>>> x = x + [2]  # Here we create a NEW object from the old one, and connect x.
>>> a            # So a is unchanged.
[7]
>>> x            # But x IS changed.
[7, 2]
这是我在Python中必须习惯的最困难的事情,因为名称和名称所指的对象是完全不同的,并且常常以令人惊讶的方式运行。这也是它最美丽的特点之一,一旦你坚果了


我最终开始认为名称是C指针,所有对象都在堆上(因为这是我的专长所在)。也许有更好的方法来考虑它,尽管我从来没有找到适合我的方法。

请参阅本文,详细解释如何通过添加新列表而不是插入原始列表来创建新列表。非常感谢您的回答,现在对我来说更清楚了。看起来我应该学习更多关于python的基础知识:)你说得对,名称和对象是不同的。名字就像贴在物体上的标签;通过
name=…
将标签指定给对象(这称为将对象绑定到名称)。单个对象可以有多个标签(如执行
name2=name
时)。困难在于
name
name=…
中表示一个标签,但在
name2=name
(或
name+=[0]
)中表示一个对象。因此列表类似于C中的数组,我们可以使用切片来更改值。啊,我找到了另一个解决方案,对于[a,b]:x[:]=x+[0]中的x,python很有趣。