益702 2024-06-06 23:08 采纳率: 100%
浏览 1
已结题

关于pyhthon中列表copy()后的连带修改问题

对一个变量a使用copy()方法得到c后,修改其a的内容,变量c竟然也会跟着变,是什么原因呢

a=[['43', '30', ''],
 ['07', '30', ''],
 ['14', '30', ''],
 ['15Y', '30', ''],
 ['22', '30', ''],
 ['37Y', '30', ''],
 ['45', '30', '']]

b=a

c=a.copy()
print('a',a)
print('b',b)
print('c',c,'\n')

def get_gps(a):
    a1=a.copy()
    gps=[]
    for i in a1:
        if 'Y'in str(i[0]):
            gps.append(a1.index(i))
            i[0]='0'
    return gps

get_gps(a)
print('a',a)
print('b',b)
print('c',c,'\n')

c.append(['0','0','0'])
print('a',a)
print('b',b)
print('c',c,'\n')


运行的结果竟然是a、b、c三个变量都跟着产生了变化,b跟随a变化可以理解,c不是copy的另一个独立的变量了吗?
.
.

img

.
.
解决思路:一开始是直接用for循环在全局运行,发现了这个问题后,我考虑到可能是因为for的循环会强制全局相同的变量一起更改,于是我把这个for改写成一个def函数,运行结果也是一样,我不明白。我想要复制一个a的副本来做其他操作而不影响a的值

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-06 23:08
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在Python中,列表是一个可变的数据结构,这意味着你可以更改列表的内容,而不需要创建一个新的列表对象。当你使用copy()方法复制列表时,它只会复制列表的第一层元素,如果列表中包含其他列表(如嵌套列表),这些嵌套列表不会被复制,而是通过引用被复制过去。因此,修改原始列表中的嵌套列表也会反映在复制后的列表中。

    在你提供的代码示例中,a是一个包含多个子列表的列表。当你执行b = a时,b并不是a的一个副本,而是指向同一个列表对象的另一个引用。因此,对a的任何修改都会反映在b上。

    当你执行c = a.copy()时,ca的一个浅拷贝(shallow copy)。这意味着c是一个新的列表,但它包含的元素(即a中的子列表)与a中的子列表是相同的引用。因此,对a中的子列表的修改也会反映在c上。

    在你的get_gps函数中,你修改了a1中的元素,a1a的浅拷贝,所以这些修改也会反映在ac上。

    要解决这个问题,你可以使用深拷贝(deep copy),这样就会创建一个新的列表,以及所有嵌套列表的副本,修改其中一个不会影响另一个。你可以使用copy模块中的deepcopy函数来实现深拷贝:

    import copy
    
    a = [['43', '30', ''],
         ['07', '30', ''],
         ['14', '30', ''],
         ['15Y', '30', ''],
         ['22', '30', ''],
         ['37Y', '30', ''],
         ['45', '30', '']]
    b = a
    c = a.copy()
    
    def get_gps(a):
        a1 = copy.deepcopy(a)  # 使用深拷贝
        gps = []
        for i in a1:
            if 'Y' in str(i[0]):
                gps.append(a1.index(i))
                i[0] = '0'
        return gps
    
    get_gps(a)
    
    c.append(['0', '0', '0'])
    

    关于提供的图片内容,由于我无法直接解析图片,你需要提供图片中的文字内容或者描述图片中的关键信息,以便我能够提供更具体的帮助。

    对于参考资料,你可以查看Python官方文档中关于深拷贝和浅拷贝的部分:

    希望这能帮助你理解copy()方法的行为,并解决你的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月14日
  • 已采纳回答 6月6日
  • 创建了问题 6月6日

悬赏问题

  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值