gpt4 book ai didi

python:循环列表并在循环内分配值

转载 作者:太空狗 更新时间:2023-10-29 21:19:25 26 4
gpt4 key购买 nike

我有以下代码,为什么第一个没有改变alist而第二个变化呢?

alist = [[1,2], [3,4], [5,6]]
for item in alist:
item = 1
print(alist)

alist = [[1,2], [3,4], [5,6]]
for item in alist:
item = item.append(10)
print(alist)

最佳答案

这是变量的一种有点不直观的行为。之所以会这样,是因为在 Python 中,变量始终是对值的引用。

盒子和标签

在某些语言中,我们倾向于将变量视为放置值的“盒子”;然而,在 Python 中,它们是引用,其行为更像是标签或值的“昵称”。因此,当您将 1 归因于 item 时,您只更改变量引用,而不是它指向的列表。

图形表示可以提供帮助。下图表示由 alist = [[1,2], [3,4], [5,6]] 创建的列表

A list with three sublists

鉴于此,让我们看看当我们执行您的第一个循环时会发生什么。

第一个循环

当你执行 for item in alist ,你要求解释器从列表中取出每个值,每次一个,把它放在变量 item 上。并在其中做一些操作。例如,在第一个操作中,我们有这个新模式:

Now a variable points to a sublist

请注意,我们不会将子列表复制到 item ;相反,我们通过 item 指向它.然后,我们执行 item = 1 - 但是这是什么意思?这意味着我们正在制作 item指向值 1 , 而不是指向子列表:

item points to other value now

请注意,旧引用丢失了(红色箭头),现在我们有了新引用。但是我们只是改变了一个指向列表的变量——我们没有改变列表本身。

然后,我们进入循环的第二次迭代,现在 item指向第二个子列表:

item pointing to the second sublist

当我们执行 item = 1 ,同样,我们只是让变量指向另一个值,而不更改列表:

enter image description here

现在,当我们执行第二个循环时会发生什么?

第二个循环

第二个循环作为第一个循环开始:我们使 item引用第一个子列表:

Now a variable points to a sublist

然而,第一个区别是我们调用 item.append() . append()是一个方法,所以它可以改变它正在调用的对象的值。正如我们常说的,我们正在向 item 指向的对象发送一条消息。追加值 10。在这种情况下,操作不是在变量 item 中进行的。 ,但直接在它所指的对象中!所以这里是调用item.append()的结果:

A list has grown

但是,我们不仅仅在列表中附加一个值!我们还分配了 item.append() 返回的值.这将切断 item对子列表的引用,但这里有一个问题:append()返回 None .

enter image description here
None值(value)
None是一个基本上表示相关值不可用的值。当函数返回 None ,它在大多数情况下是说,“我没有任何相关的东西可以给你。” append()确实直接更改了它的列表,所以它不需要返回任何东西。

这很重要,因为您可能相信 item将指向附加列表 [1, 2, 10] , 对?不,现在它指向 None .所以,你会期望下面的代码......

alist = [[1,2], [3,4], [5,6]]
for item in alist:
item = item.append(10)
print(item)

要打印这样的东西:
[1, 2, 10]
[3, 4, 10]
[5, 6, 10]

但这不会发生。这是发生的事情:
>>> alist = [[1,2], [3,4], [5,6]]
>>> for item in alist:
... item = item.append(10)
... print(item)
...
None
None
None

然而,正如我们所评论的, append()方法更改了列表本身。所以,虽然 item变量赋值后无用,修改最终列表!
>>> print alist
[[1, 2, 10], [3, 4, 10], [5, 6, 10]]

如果要在循环内使用附加列表,只需不要将方法返回值分配给 item .做这个:
>>> alist = [[1,2], [3,4], [5,6]]
>>> for item in alist:
... item.append(10)
... print item
...
[1, 2, 10]
[3, 4, 10]
[5, 6, 10]

这是有效的,因为 item仍将指向列表。

结论

引用文献一开始理解起来都有些复杂,更别说掌握了。然而,它们真的很强大,如果你跟随例子等就可以学习。你的例子有点复杂,因为这里发生了更多的事情。

Python Tutor可以帮助您了解正在发生的事情,因为它以图形方式执行每个步骤。 Check your own code running there!

关于python:循环列表并在循环内分配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39941393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com