列表中的修改

ice*_*ime 11 python

我是Python的新手但我明白事情不应该这样做,所以请考虑以下代码片段纯粹教育:-)

我目前正在阅读"学习Python"并尝试完全理解以下示例:

>>> L = [1, 2, 3, 4, 5]
>>> for x in L:
...    x += 1
...
>>> L
[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

我不明白这种行为是否与数值类型的不变性有些相关,所以我运行了以下测试:

>>> L = [[1], [2], [3], [4], [5]]
>>> for x in L:
...    x += ['_']
...
>>> L
[[1, '_'], [2, '_'], [3, '_'], [4, '_'], [5, '_']]
Run Code Online (Sandbox Code Playgroud)

问题:是什么使列表在第一个代码中保持不变并在第二个代码中更改?

我的直觉是语法有误导性,并且:

  • x += 1一个整数真的意味着x = x + 1(因此分配一个新的引用)
  • x += ['_']列表真的意味着x.extend('_')(因此更改列表)

Mat*_*ttH 5

问题:是什么使列表在第一个代码中保持不变并在第二个代码中更改?

在第一个代码中,列表是一系列(不可变的)整数.循环设置x依次引用序列的每个元素.x += 1更改x以引用比x之前引用的值多一个的不同整数.原始列表中的元素保持不变.

在第二个代码中,列表是否有一系列(可变)列表.循环设置x依次引用序列的每个元素.x += ['_']作为x列表的引用,这扩展了xwith 引用的列表['_'].