Python:列表追加函数的奇怪行为

标签 python list

我是 Python 新手。

我试着做一个 Kruskal 算法。这是我的代码:

#c={('v','a'):5,('v','g'):5,('g','a'):5,('v','b'):7,('v','e'):4,('f','e'):8,('f','b'):8,('f','c'):11,('c','e'):9,('c','d'):7,('c','b'):9,('e','d'):8}
#n=8

def argmin(c):
    m=1e100
    r=()
    for i in c:
       if c[i]<m:
           m=c[i]
           r=i
    return r

def kruskal (n, c):
    T=[]
    B=[]
    while len(T)<n-1:
        E=argmin(c)
        c.pop(E)
        e=[]
        e+=E
        a0=0
        a1=0
        f0=-1
        f1=-1
        cross=0
#        print('e avant',e)
        for i in range(len(B)):
            for j in range(len(B[i])):
                if e[0]==B[i][j]:
                    cross+=1
                    f0=i   
                if e[1]==B[i][j]:
                    cross+=1
                    f1=i                        
            if cross==2: break
            else: cross=0
        if cross==2: continue
#        print('e apres',e)
        T.append(e)
#        print('T',T)
        if f0!=-1 and f1!=-1:
            B[f0].extend(B[f1])
            B.pop(f1)
        elif f0!=-1:
            B[f0].extend(e[1])
        elif f1!=-1:
            B[f1].extend(e[0])
        else :
            B.append(e)        
#        print('B', B)                
    return T

我遇到的问题是在行中:“T.append(e)” 结果 T[0] 不是我所期望的。 如果我输入以下内容:

c={('v','a'):5,('v','g'):5,('g','a'):5,('v','b'):7,('v','e'):4,('f','e'):8,('f','b'):8,('f','c'):11,('c','e'):9,('c','d'):7,('c','b'):9,('e','d'):8}

n=8

然后我调用我的函数: 克鲁斯卡尔 (8, c) 我得到:

[['v', 'e', 'g', 'a', 'b', 'f', 'c', 'd'], ['v', 'g'] , ['v', 'a'], ['v', 'b'], ['c', 'd'], ['f', 'b'], ['e', 'd'] ]

如我所料:

[['v', 'e'], ['v', 'g'], ['v', 'a'], ['v', 'b'], ['c', 'd'], ['f', 'b'], ['e', 'd']]

最佳答案

不是在寻找你所有的代码。但是发现了一些东西,你有时会附加 listreferences。所以简单地修复:

from copy import deepcopy

T.append(deepcopy(e)) #in place of T.append(e)

将输出为

[['v', 'e'], ['g', 'a'], ['v', 'a'], ['v', 'b'], ['c', 'd'], ['f', 'b'], ['e', 'd']]

示例

a = [1, 2]
b = a
b.append(3)

>>>a
[1,2,3]

>>>b
[1,2,3]

这里发生了什么

a = [1,2]
b = a

>>>id(a), id(b)
(140526873334272, 140526873334272)

列表 [1,2] 由两个变量 ab 标记。因此,对列表的任何更改都会影响标记到它的每个 varables

关于Python:列表追加函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29250114/

相关文章:

python - 有没有一种简单的方法来判断文件指针所在的行号?

c++ - 指针不可从列表中取消引用

python - 转换具有不同格式转换的列表列表的项目

python - 如何将我的 python 应用程序制作/转换为 R Shiny 应用程序?这是一个脑筋急转弯!无法在 R 中找到 UI 需要什么更改

python - 从 python 包资源中提取文件夹

python - 如何抵消 Pandas Pearson 与日期时间索引的相关性

python - 比较字符串列表以查找序列的缺失值

python - 如何使用 Pandas 获取表格中的单个单元格?

android - Android中线程加载的Web图像

r - 为所有嵌套索引嵌套列表中的某些元素