【问题标题】:Python list append returning odd resultsPython列表追加返回奇怪的结果
【发布时间】:2013-06-29 03:47:33
【问题描述】:

我正在尝试创建一个从给定数字返回所有循环数字的函数,它给了我一个奇怪的结果。功能是:

def getcircs(mylist):
    circs=[]
    x=mylist
    y=list(x)
    dig=len(x)-1
    j=0

    circs.append(x)

    while j < dig:
        for i in range(0,dig):
            r=i+1
            g=x[r]
            y[i]=g
        y[dig]=x[0]        
        print y
        circs.append(y)
        x=list(y)
        j+=1

    print circs
    return circs

正如您在运行它时所看到的,列表“y”正在返回我正在寻找的内容,但列表“circs”似乎没有附加正确的“y”值。我想知道这是否与 Python 引用列表的方式有关,但我无法弄清楚。谢谢。

【问题讨论】:

  • 什么是循环号码?
  • 另外,总之是的。您将相同的 y 列表附加到 circs 多次。

标签: python list append


【解决方案1】:

这是因为列表是引用的,并且您重复使用 y。当您将y 附加到circs 时,circs 将获得对y 的另一个引用。当您稍后修改y 时,您将在circs 中的每个位置看到更改,其中添加了y。尝试复制 y 并使用它。

def getcircs(mylist):
    circs=[]
    x=mylist
    y=list(x)
    dig=len(x)-1
    j=0

    circs.append(x)

    while j < dig:
        temp = y[:]
        for i in range(0,dig):
            r=i+1
            g=x[r]
            temp[i]=g
        temp[dig]=x[0]        
        print temp
        circs.append(temp)
        x=list(temp)
        j+=1

    print circs
    return circs

temp = y[:] 行只是将 temp 创建为 y 的完整切片,它本身会生成一个副本。

【讨论】:

  • 谢谢。我以为我已经整理了所有参考问题,显然情况并非如此。感谢您的帮助。
【解决方案2】:

如果您想以更简单的方式进行操作(无论如何我认为),您可能会受益于在此处使用itertools.cycle。这种方法也可以清理,但你明白了:

import itertools
my_list = [1, 2, 3, 4]
cycler = itertools.cycle(my_list)
list_size = len(my_list)
for i in range(list_size):
        print [cycler.next() for j in range(list_size)] # call next on the cycler generator
        cycler.next() # skip the next number

输出

[1, 2, 3, 4]
[2, 3, 4, 1]
[3, 4, 1, 2]
[4, 1, 2, 3]

事实上,这里只写了一条:

print [[cycler.next() for j in range(list_size + 1)][:-1] for i in range(list_size)]

外出

[[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 2012-06-28
    • 2012-08-08
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多