在Python 3.x中复制列表

时间:2017-09-01 07:28:27

标签: python list copy

编辑:已解决,我只是想错了,函数从未达到大于n的数字的第二次返回,因此这里不需要任何人阅读它。

我知道这是“重复” - 但并非完全如此。 目前我正在使用Python 3.6.2

我生成一个素数列表,然后想要复制它,所以我可以修改它以找到一个特定的素数并返回素数列表。

我试过了:

new_list = old_list[:]
new_list = list(old_list)
new_list = old_list * 1
new_list = old_list.copy()
new_list = [char for char in old_list]

但没有那些工作。在我的代码中,我将素数列表简化为一个整数,然后返回数字和列表。但是,无论使用何种方法,对old_list进行的所有修改都将在new_list中完成。

有问题的代码:

def f(n):
    #generate primelist
    primes = []
    numbers = set(range(n,1,-1))
    while numbers:
            p = numbers.pop()
            primes.append(p)
            numbers.difference_update(set(range(p*2,n+1,p)))
    #any of these, none work
    primelist = primes[:]
    primelist = primes * 1
    primelist = primes.copy()
    primelist = list(primes)
    primelist = [char for char in primes]   
    #find even digits
    import re
    evendigs = re.compile(r'[24680]')
    longest = []
    prime = 0
    #remove n from primes if n is prime
    if n in primes:
        primes.remove(n)
    #find largest prime with maximum number of even digits that is smaller than n
    for i in list(reversed(primes)):
            if len(str(prime))> len(str(i)):
                return prime
            evenprime = re.findall(evendigs,str(i))
            if evenprime:
                    if len(evenprime)>len(longest):
                            longest = evenprime
                            prime = i
                    elif len(evenprime)==len(longest):
                            longest = evenprime
                            if i > prime:
                                prime = i
                    else: continue
    return (primelist, primes)

也是为什么:

a,b = f(9451)引发错误:int对象不可迭代?

假设我只返回例如primelist(应该是最多n个素数列表):

number = f(9451)但a = 8243且a不是列表

返回素数(应该是数字,即使数字错误),也会给出相同的值。

4 个答案:

答案 0 :(得分:2)

您的代码中存在问题:

考虑这个例子:

>> l = [1, 2, 3]
>> m = l
>> n = l[:]
>> l.append(4)
>> l
[1, 2, 3, 4]
>> m
[1, 2, 3, 4]
>> n
[1, 2, 3]

大多数(如果不是全部)示例都应该制作副本,尽管在大多数情况下都是浅色副本。

返回您的代码:

 #remove n from primelist if n is prime
if n in primes:
    primes.remove(n)

这不符合评论的意思。

这应该是

if n in primes:
    primelist.remove(n)

答案 1 :(得分:-1)

我也遇到过类似的问题。 尝试将现有列表复制到另一个列表,然后开始操作第二个列表。 它可以通过。

list2 = [x for x in list1] 

您现在可以在list2中进行更改而不会影响list1

答案 2 :(得分:-1)

因为您尝试所有获取新列表的方式是旧列表的副本,而不是新列表,您可以尝试这样做:

newlist = []
for tmp in oldlist:
    newlist.append(tmp)

答案 3 :(得分:-3)

你可以尝试

newList = oldList[:]

我做了什么,它确实复制了这份清单。它主要是你的代码,你的复制部分是好的。

def f(n):
    primes = []
    numbers = set(range(n, 1, -1))
    while numbers:
        p = numbers.pop()
        primes.append(p)
        numbers.difference_update(set(range(p * 2, n + 1, p)))
    primelist = primes[:]
    primes.append(50)
    print(primes)
    print(primelist)

def main():
    f(100)



if __name__ == "__main__":
    main()