python: changes to my copy variable affect the original variable
本问题已经有最佳答案,请猛点这里访问。
我有一个列表,我创建了一个副本,以便在保留原始列表的同时进行一些操作。但是,当我把
1 2 3 4 5 6 7 8 | org_list = ['y', 'c', 'gdp', 'cap'] copy_list = org_list copy_list.append('hum') print(copy_list) print(org_list) |
收益率
1 2 | ['y', 'c', 'gdp', 'cap', 'hum'] ['y', 'c', 'gdp', 'cap', 'hum'] |
我对实际发生的事情不太了解,但看起来
有没有一种方法可以在不做诸如以下笨拙的事情的情况下制作一份组织列表的独立副本:
1 2 3 | copy_list = [] for i in org_list: copy_list.append(i) |
我这样说是因为我对其他类型的变量也有同样的问题,例如熊猫数据帧。
这是因为在python中,设置一个变量实际上会设置对该变量的引用。几乎每个学习Python的人都会在某个时刻遇到这种情况。解决方案是简单地复制列表:
1 | copy_list = org_list[:] |
这只是复制参考资料
1 | copy_list = org_list |
你应该使用
1 | copy_list = org_list[:] # make a slice that is the whole list |
或
1 | copy_list = list(org_list) |
当你写作时
1 | org_list = ['y', 'c', 'gdp', 'cap'] |
创建列表对象,并将其命名为"org-list"。
当你这样做的时候
1 | copy_list = org_list |
你的意思是,"复制列表"这个名字和组织列表指的是同一个对象。
如果列表只包含不可变类型,则可以通过
1 | copy_list = list(org_list) |
但请注意,只有当列表对象不可变时,这才有效,因为它创建了一个浅副本,即复制了列表,但列表中的每个元素都不重复。
如果您有列表列表,并且希望所有内容都被复制,则需要执行深度复制:
1 2 3 | import copy org_list = ['y', 'c', ['gdp', 'rtd'], 'cap'] copy_list = copy.deepcopy(org_list) |
python中的变量名是对原始变量的引用。要实际制作副本,您需要明确:
1 2 3 | import copy copy_list = copy.copy(org_list) |