提问人:Shumagel 提问时间:10/31/2023 更新时间:10/31/2023 访问量:32
为什么这些代码在 Python for 循环列表中的工作方式不同
Why are these codes working differently in Python for loop list
问:
我是编码的初学者,但有时需要这样做。 我想制作在列表中临时挑选出元素的代码。 例如 [1,2,3,4] >> [2,3,4] [1,3,4] [1,2,4] [1,2,3] 同上 所以我做了一些代码。但结果与我的预期不同。 例如,以下代码, 只有No3和我的期望一样。
1)
a = [1,2,3,4]
c = [1,2,3,4]
for i in a:
b = c
b.remove(i)
print(b)
[2, 3, 4][3, 4][4] []
2)
a = [1,2,3,4]
for i in a:
b = a
b.remove(i)
print(b)
[2, 3, 4][2, 4]
3)
a = [1,2,3,4]
for i in a:
b = [1,2,3,4]
b.remove(i)
print(b)
[2, 3, 4][1, 3, 4][1, 2, 4][1, 2, 3]
这些代码的工作方式与我想象的不同的原因。 我希望你能给我一个答案。 谢谢。
答:
在 for 循环中的每次迭代中,您实际上是在修改 c (b=c)。“b”不是新的内存位置,它只是指向旧列表“c”:
>>> a = [1,2,3,4]
>>> c = [1,2,3,4]
>>> for i in a:
... print (f'c: {c}')
... b = c
... b.remove(i)
... print(f'b: {b}')
...
c: [1, 2, 3, 4]
b: [2, 3, 4]
c: [2, 3, 4]
b: [3, 4]
c: [3, 4]
b: [4]
c: [4]
b: []
要解决此问题,您必须创建原始列表“c”的副本:
>>> import copy
>>>
>>> a = [1,2,3,4]
>>> c = [1,2,3,4]
>>> for i in a:
... b = copy.deepcopy(c)
... b.remove(i)
... print(b)
...
[2, 3, 4]
[1, 3, 4]
[1, 2, 4]
[1, 2, 3]
在此处查看更多详细信息。
评论
这些代码工作方式不同的原因是因为
1)
a = [1,2,3,4]
c = [1,2,3,4]
for i in a:
b = c
b.remove(i)
print(b)
[2, 3, 4][3, 4][4] []
对于此代码
变量“B”和“C”是链接的(它们指向相同的内存空间),因此从列表“B”中删除的任何内容也会从列表“C”中删除
2)
a = [1,2,3,4]
for i in a:
b = a
b.remove(i)
print(b)
[2, 3, 4][2, 4]
对于此代码
变量“A”和“B”也是链接的,因此从列表“B”中删除的任何内容也会从列表“A”中删除。但是,当您从列表“b”(链接到列表“a”)中删除时,“for 循环”的项目也会受到影响。
3)
a = [1,2,3,4]
for i in a:
b = [1,2,3,4]
b.remove(i)
print(b)
[2, 3, 4][1, 3, 4][1, 2, 4][1, 2, 3]
对于此代码
列表 [1,2,3,4] 在循环的每次迭代中分配给“B”的内容,说明它为什么工作
若要将一个列表分配给另一个列表而不链接它,请使用
copy.deepcopy(a)
上一个:索引函数给了我重复的响应
评论