【问题标题】:How to make a shallow copy of a list in Python如何在 Python 中制作列表的浅表副本
【发布时间】:2013-04-22 15:08:35
【问题描述】:

我正在尝试在 Python 中实现一种算法来生成列表的所有排列。但是我在我的 for 循环中我希望保持原始前缀和剩余列表完好无损,因此我试图使用 newprefix 和 newrest 制作这些列表的副本,但是在每次迭代时打印变量 rest 时,我看到即使变量休息正在被修改!如何在 Python 中制作列表的浅表副本?还是我尝试的逻辑有其他问题?

def perm(prefix, rest):
    if len(rest) == 0:
        print prefix 
    for i in range(len(rest)):
        #prints in the for loop are just for debugging
        print "rest:", rest
        print "i=", i
        newprefix = prefix
        newprefix.append(rest[i])
        newrest = rest
        newrest.pop(i)
        print "old pre : ", prefix
        print "newpre=", newprefix
        print "newrest=", newrest
        perm(newprefix, newrest)


perm([], ['a','b','c'])

【问题讨论】:

  • 除非这是为了你自己的丰富,你可能应该使用 itertools.permutations()。

标签: python python-2.7


【解决方案1】:
import copy

a = [somestuff]
b = copy.copy(a) # Shallow copy here.
c = copy.deepcopy(a) # Deep copy here.

复制模块值得了解。 https://docs.python.org/3/library/copy.html

(Python 2)http://docs.python.org/2/library/copy.html

【讨论】:

    【解决方案2】:

    要进行浅拷贝,您可以对列表进行切片:

    newprefix = prefix[:]
    

    或者将其传递给list构造函数:

    newprefix = list(prefix)
    

    另外,我认为您可以稍微简化一下代码:

    def perm(prefix, rest):
        print prefix, rest
    
        for i in range(len(rest)):
            perm(prefix + [rest[i]], rest[:i] + rest[i + 1:])
    
    perm([], ['a','b','c'])
    

    【讨论】:

    • 您的第一个(切片)是我完成此任务的首选方式。我只是想我也会让他们知道复制模块。 +1
    • 只是想知道 - 切片操作不是非声明性的吗?清楚地声明你在做什么不是最好的吗? copied_list = original_list[:] 没有声明副本正在发生,而 copied_list = copy.copy(original_list) 是高度声明性的。
    • 将列表传递给 list() 构造函数不会给出参数列表的浅表副本。
    猜你喜欢
    • 2015-02-22
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2020-06-23
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多