我是Python的新手,但我知道事情不应该这样做,所以请将以下代码片段视为纯粹的教育: - )
我目前正在阅读“学习Python”并尝试完全理解以下示例:
>>> L = [1, 2, 3, 4, 5]
>>> for x in L:
... x += 1
...
>>> L
[1, 2, 3, 4, 5]
我不明白这种行为是否与数字类型的不变性有关,所以我运行了以下测试:
>>> L = [[1], [2], [3], [4], [5]]
>>> for x in L:
... x += ['_']
...
>>> L
[[1, '_'], [2, '_'], [3, '_'], [4, '_'], [5, '_']]
问题:是什么让第一个代码中的列表保持不变并在第二个代码中更改?
我的直觉是语法具有误导性,并且:
x += 1
对于整数实际上意味着x = x + 1
(因此分配新的引用)x += ['_']
列表实际上意味着x.extend('_')
(因此更改了列表)答案 0 :(得分:5)
问题:是什么让第一个代码中的列表保持不变并在第二个代码中发生了变化?
在第一个代码中,列表是一系列(不可变的)整数。循环设置x
依次引用序列的每个元素。 x += 1
更改x
以引用一个比之前引用的值x
多一个的其他整数。原始列表中的元素保持不变。
在第二个代码中,列表是否包含(可变)序列。循环设置x
依次引用序列的每个元素。 x += ['_']
x
引用一个列表,这会将x
引用的列表扩展为['_']
。