列表修改
问题描述:
我是一个新手到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('_')
(从而改变列表中)
答
问题:是什么让第一个代码中的列表保持不变并在第二个代码中发生了变化?
在第一个代码中,列表是一个(不可变的)整数序列。循环设置x
依次引用序列的每个元素。 x += 1
将x
更改为表示比之前提到的值x
多一个的不同整数。原始列表中的元素保持不变。
在第二个代码中,列表是否包含(可变)列表的序列。循环设置x
依次引用序列的每个元素。 x += ['_']
由于x
涉及一个列表,因此将x
所指的列表扩展为['_']
。
+0
所以它是真正的解释它的整数的不变性,谢谢! – icecrime 2012-03-28 12:55:35
你的直觉是正确的 – 2012-03-28 12:12:19
为了完整性,“正确”的方法是'[x + 1 for x in L]' – Kimvais 2012-03-28 12:17:55
@Kimvais:假设你想创建一个新列表。 – MattH 2012-03-28 12:26:20