最近我一直在清理一些数据,只有一件事令我震惊。 简单的例子:
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中,这是不可能的。
预先感谢
答案 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
时,b
是a
的副本,因此您可以单独编辑它们。但是,使用列表执行此操作时,两个变量对应于同一对象。这主要是为了提高效率(每次执行a = b
之类的操作时复制列表都是非常低效的,并且常常是无用的)。因此,当您编辑一个时,另一个会受到影响。
在for x in test_list2:
中,x
是test_list2
元素的副本。但是在for x in test_list1:
中,x
直接对应于test_list2
的元素(列表)。
有关更多详细信息,您可以阅读this article about mutable objects。
答案 1 :(得分:0)
我认为最重要的是,在您的第一个循环中,x
的每个实例都是一个列表。在第二个循环中,x
的每个实例都是一个整数。在Python中,列表是可变的,但整数是不可变的。如果您在网上搜索“ python可变与不可变”,那么您会发现许多页面,它们描述了差异是什么以及为什么会导致这样的结果。