python - Python list clear() 奇怪的行为

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 仍然指向最后添加的子列表,我们更改了它的第一项

相似文章

javascript - 如何使文本出现在窗口中?

我试图在javascript中创建秒表,直到遇到问题。当完成实际时钟时,我发现数字并没有显示在预览窗口中,而是显示在控制台中。有没有办法让文本出现在预览窗口中?起初,我试图查看“Prompt()”机制...

最新文章