【问题标题】:Python's list subtle trick?Python 的列表技巧?
【发布时间】:2021-02-07 22:17:06
【问题描述】:

我喜欢通过 pythoninstitute.org 的课程材料学习 Python,其中一个测验包括:

l1 = ["A", "B", "C"]
l2 = l1
l3 = l2
del l1[0]
del l2[:]
print(l3)

我期待['B'。 'C'] 作为 print(l3) 的结果,同时正确的结果是 []。

我不明白为什么。你能给我解释一下吗?

为了得到我期望的结果,我必须编写如下代码:

l1 = ["A", "B", "C"]
l2 = l1
l3 = l2
del l1[0]
l4 = l2[:]
del l4
print(l3)

你能解释一下这两个sn-p的区别吗?

【问题讨论】:

  • l3 = l2复制l2l2 = l1也不复制l1
  • 请参阅herehere
  • 如果您查找pass by reference versus pass by value,您将能够更直观地理解这一点。尽管这里我们没有使用函数,但想法是一样的。作为一般规则,可以这样看待它 - 因为事先不知道集合的大小,编程语言通常会处理原始集合的地址而不是复制它。如果您将 java 中的数组分配给三个变量,您会看到完全相同的行为。

标签: python list del


【解决方案1】:
l2 = l1
l3 = l2

l2 指向与l1 相同的内存位置,因此l3l2l1 指向相同。对这三个变量中的任何一个进行任何修改都将反映所有 3 个变量。
当您执行l4 = l1[:] 时,l4 将成为l1 的副本,而不仅仅是指向与l1 相同的位置。

【讨论】:

    【解决方案2】:

    这是因为,当您将一个列表分配给另一个列表时,它只是通过另一个变量为同一存储创建引用。 l1,l2,l3 都是指同一个数据。

    当您从一个列表中删除一个元素时,数据会反映在引用该数据的所有变量中。

    在您的第二个代码中,您可能会得到与以下相同的结果。基本上,您通过执行 del l1[0] 从所有变量 l1、l2、l3 的 0 索引中删除值 '

    l1 = ["A", "B", "C"]
    l2 = l1
    l3 = l2
    del l1[0]
    
    print(l3)
    

    '

    【讨论】:

      【解决方案3】:
      del l[:]
      

      这会清除整个列表。并且因为所有这些变量都指向同一个内存位置,就像前面的答案中提到的那样,你会得到这个结果。 另请查看文档。 https://docs.python.org/3/tutorial/datastructures.html

      【讨论】:

        【解决方案4】:

        在 python 中,使用 .copy() 方法复制一个列表,如果你将一个列表分配给另一个列表,它将共享相同的内存位置。 in the image you can find the difference between list.copy() and assign

        lst1 = [1,2,3,4]
        lst2 = lst1
        lst3 = lst1.copy()
        print("lst1 address : ", hex(id(lst1)))
        print("lst2 address : ",hex(id(lst2)))
        print("lst3 address : ",hex(id(lst3)))
        
        lst1 address :  0x1f00c983f00
        lst2 address :  0x1f00c983f00
        lst3 address :  0x1f00a3127c0
        

        如果你删除list1中的元素,list2中的元素也会被删除,因为它们共享相同的内存位置。

        【讨论】:

          最近更新 更多