【发布时间】:2017-07-05 13:18:45
【问题描述】:
运行这个:
a = [[1], [2]]
for i in a:
i *= 2
print(a)
给予
[[1, 1], [2, 2]]
我希望得到原始列表,就像这里发生的那样:
a = [1, 2]
for i in a:
i *= 2
print(a)
这给出了:
[1, 2]
为什么要修改第一个示例中的列表?
【问题讨论】:
-
因为您将嵌套列表对象相乘,这些对象是可变的并且就地更新。第二个示例乘以整数,这些整数是不可变的,因此无法就地更新并返回一个新整数。
-
@MartijnPieters 它们是可变的很清楚,它们是就地更新的需要解释
-
@mpf82 不重复:我需要知道就地更新意味着什么
-
测试以下内容:
for i in a: print(hex(id(i))),注意地址。现在这样做:for i in a: i *= 2; print(hex(id(i)))。比较地址。您将意识到,在元素不可变(整数)的情况下,地址会发生变化,而在元素可变(列表)的情况下,地址是相同的。这就是为什么元素在一种情况下被修改而不在另一种情况下被修改的原因:当返回相同的对象可变时,当不可变时,它是不同地址的副本,因此修改它不会修改原始对象。 -
列表是可变的;整数不是。列表上的
*=运算符会改变列表。 int 上的*=运算符返回一个新 int(分配给运算符左侧的变量)。
标签: python list augmented-assignment