为什么这些代码在 Python for 循环列表中的工作方式不同

Why are these codes working differently in Python for loop list

提问人:Shumagel 提问时间:10/31/2023 更新时间:10/31/2023 访问量:32

问:

我是编码的初学者,但有时需要这样做。 我想制作在列表中临时挑选出元素的代码。 例如 [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循环 复制

评论


答:

0赞 Mircea Cristian 10/31/2023 #1

在 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]

在此处查看更多详细信息。

评论

0赞 Shumagel 11/2/2023
谢谢。我会更详细地检查它
0赞 Kuroneko 10/31/2023 #2

这些代码工作方式不同的原因是因为

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)