循环运行后,列表中的值已更改

时间:2018-12-12 22:43:35

标签: python list loops

最近我一直在清理一些数据,只有一件事令我震惊。 简单的例子:

test_list1 = [[1,2,3,4,5], [1,2,3,4,5]]

for x in test_list1:
    for y in range(0, len(x)):
        x[y] = 0

print(test_list1)

-> [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

但是,如果尝试以下操作,则会得到不同的结果:

test_list2 = [1,2,3,4,5]

for x in test_list2:
    x = 0

print(test_list2)

-> [1, 2, 3, 4, 5]

在我看来,在test_list1中,我能够更改其子列表中的值而无需实际引用test_list1似乎很奇怪。 如果我没有明确声明test_list1 [0] [0] = 0等等,为什么只通过运行循环来更改test_list1中的值? 在test_list2中,这是不可能的。

预先感谢

2 个答案:

答案 0 :(得分:1)

您的问题可以简化为:

a = 0
b = a
b = 1
print(a, b) # >> 0 1

a = [0,0]
b = a
b[0] = 1
print(a, b) # >> [1, 0] [1, 0]

这是因为当您对数字进行b = a时,ba的副本,因此您可以单独编辑它们。但是,使用列表执行此操作时,两个变量对应于同一对象。这主要是为了提高效率(每次执行a = b之类的操作时复制列表都是非常低效的,并且常常是无用的)。因此,当您编辑一个时,另一个会受到影响。

for x in test_list2:中,xtest_list2元素的副本。但是在for x in test_list1:中,x直接对应于test_list2的元素(列表)。

有关更多详细信息,您可以阅读this article about mutable objects

答案 1 :(得分:0)

我认为最重要的是,在您的第一个循环中,x的每个实例都是一个列表。在第二个循环中,x的每个实例都是一个整数。在Python中,列表是可变的,但整数是不可变的。如果您在网上搜索“ python可变与不可变”,那么您会发现许多页面,它们描述了差异是什么以及为什么会导致这样的结果。