numbers = [12,23,34]
sum = []
for number in numbers:
num = []
for n in str(number):
num.append(int(n))
sum.append(num)
print(sum)
如果我在 sum.append(num)
之后添加 num.clear()
,它会将空数组附加到总和。为什么会这样?看起来 num
没有附加到 sum
直到 num
被清除
我知道 clear() 在这里是不必要的,因为我在循环开始时重新初始化 num
,但是这种行为对我来说很奇怪,特别是如果 python 解释器逐行运行
回答1
num = []
和 num.clear()
做两件不同的事情。
num.clear()
告诉 num
指向的 list 清空自身。 num = []
重新分配 num
以指向一个全新的(空的)list。
当您执行 sum.append(num)
时,您会将 num
list 附加到 sum
-- num
仍然指向相同的 list,因此当您 clear
时,您正在清除相同的list 现在是 sum
的一部分。
num
在您将其附加到 sum
时不为空,但随后调用 clear()
会将其清空。一切都在有序进行;您的困惑源于您认为 sum
中的 list 在附加后不可能更改的事实。惊喜,lists 是可变的! :)
(顺便说一下,不要命名变量 sum
——它是一个非常有用的内置函数的名称,如果你想稍后在程序中使用该函数,你会困惑为什么它是一个 list 而不是功能!)
回答2
num
引用一个特定的可变对象。即使将对象分配给 sum
(顺便说一句,不要使用 sum
作为变量名,它是一个 python 内置),你清除完全相同的对象。
这是另一个向您展示 list 突变的示例:
numbers = [12,23,34]
Sum = []
for number in numbers:
num = []
for n in str(number):
num.append(int(n))
Sum.append(num)
num[0] = 'a'
print(Sum)
# [[1, 2], [2, 3], ['a', 4]]
如您所见, num
仍然指向最后添加的子列表,我们更改了它的第一项