Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 附加元素不反映后浅复制_Python_Python 3.x_Copy_Shallow Copy - Fatal编程技术网

Python 附加元素不反映后浅复制

Python 附加元素不反映后浅复制,python,python-3.x,copy,shallow-copy,Python,Python 3.x,Copy,Shallow Copy,旧列表和新列表都指向不同的内存位置,那么如何 旧列表中的项目分配是否反映在新列表中 import copy old_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]] new_list = copy.copy(old_list) old_list[2][0]=5 old_list[2][1]=5 print("Old list:", old_list) print("New list:", new_list) print(&

旧列表和新列表都指向不同的内存位置,那么如何 旧列表中的项目分配是否反映在新列表中

import copy

old_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
new_list = copy.copy(old_list)
old_list[2][0]=5
old_list[2][1]=5
print("Old list:", old_list)
print("New list:", new_list)
print("Old list:", id(old_list))
print("New list:", id(new_list))

内存位置仍然不同,因此追加更改不会反映在新列表中。

copy.copy操作执行浅拷贝。因此,将创建新的列表列表(id不同)。但是,由于变量是列表对象列表,因此新的_list变量仍然保持对现有列表元素的引用。 下面是复制函数()的解释 浅复制构造一个新的复合对象,然后(尽可能)向其中插入对原始对象的引用。 您可以通过打印列表中每个(列表)元素的id来检查这一点,如
print(id(旧列表[0]))print(id(新列表[0]))
在这里,两个ID将是相同的

因为这个原因

  • 当您尝试更新列表元素(列表内部)的值时,它会更新两个列表变量(旧列表、新列表)
  • 当您将新元素附加到旧的\u列表时,它不会在创建浅层副本时影响新的\u列表

  • 新列表是旧列表的浅拷贝。“浅表副本构造一个新的复合对象,然后(尽可能)在其中插入对原始中找到的对象的引用……可以使用dict.copy()创建字典的浅表副本,并通过指定整个列表的一部分来创建列表”[1]

    您没有提供输出,但旧\u列表和新\u列表是两个不同的实例:

    old_list.append([4, 4, 4])
    print("Old list:", old_list)
    print("New list:", new_list)
    print("Old list:", id(old_list))
    print("New list:", id(new_list))
    
    列表本身并非仅共享元素(如果可能),这就是为什么附加值不会反映在浅表副本中的原因。我发现a=[0]不会共享0,但a=[[0]]子列表[0]是共享的。您可以在子元素上使用id()来探索这一点

    [1]


    这种记忆可视化完美地解释了整个画面。

    这正是浅拷贝应该发生的事情。如果您不希望出现这种行为,为什么要复制?如果两者都引用相同的内存位置,那么它们不应该给出相同的输出吗@用户2357112SupportsMonica
    新列表
    旧列表
    不引用相同的内存位置。(同样,内存位置是错误的抽象级别。)
    ('Old list:', 140523233341592)  
    ('New list:', 140523233342096)