Python 如何将列表附加到列表中?

Python 如何将列表附加到列表中?,python,list,append,Python,List,Append,我试图将一个列表附加到另一个列表中,但我似乎无法使其工作 这是代码。当我运行它并为while循环的每个迭代打印Q时,我得到类似于[2,3][2][3,4]等的东西,我想通过执行my_Q.append(Q)将这些列表附加到列表my_Q中。但是,这会返回以下结果:my_Q=[0,[],[],[] import random #Matrix Input M = 10**3 G = [ [M, 5, 9, M], [M, M, 1, 10], [M, M, M,

我试图将一个列表附加到另一个列表中,但我似乎无法使其工作

这是代码。当我运行它并为while循环的每个迭代打印Q时,我得到类似于[2,3][2][3,4]等的东西,我想通过执行my_Q.append(Q)将这些列表附加到列表my_Q中。但是,这会返回以下结果:my_Q=[0,[],[],[]

import random

#Matrix Input
M = 10**3

G = [   [M, 5, 9, M],
        [M, M, 1, 10],
        [M, M, M, 4],
        [M, M ,M, M]    ]

#Initialize
Q = [1]
l = [0, M, M, M]
A = [1, 2, 3, 4]
iter = 0

#For display
my_v = [0]
my_Q = [1]

#Algorithm
while Q:        #Stop conditions
    
    iter += 1

    #Step 2:
    v = random.choice(Q)
    Q.remove(v)

    #Step 3:
    for w in A:
        l_new = min(l[w-1], l[v-1] + G[v-1][w-1])
        if l_new != l[w-1]:
            if w not in Q:
                Q.append(w)
            l[w-1] = l_new

    #Save for display
    my_v.append(v)
    
    print(Q)
    my_Q.append(Q)

print(my_Q)

你有问题。Python会混淆您的实现,但是将一个列表附加到另一个列表只会添加一个引用,而不是列表的值

请尝试以下简单代码:

l=[]
a=[1,2]
l、 附加(a)
a、 删除(1)
l、 附加(a)
印刷品(l)
输出 在本例中,您希望看到类似于
[[1,2],[2]]
的内容,但是由于
a
只是
l
中的一个引用,因此在1上调用
remove
将其从
a
中删除外部变量及其在列表
l
中的引用

您可以
导入副本
并附加列表的深度副本

import copy
import random

# Matrix Input
M = 10 ** 3

G = [[M, 5, 9, M],
     [M, M, 1, 10],
     [M, M, M, 4],
     [M, M, M, M]]

# Initialize
Q = [1]
l = [0, M, M, M]
A = [1, 2, 3, 4]
iter = 0

# For display
my_v = [0]
my_Q = [1]

# Algorithm
while Q:  # Stop conditions

    iter += 1

    # Step 2:
    v = random.choice(Q)
    Q.remove(v)

    # Step 3:
    for w in A:
        l_new = min(l[w - 1], l[v - 1] + G[v - 1][w - 1])
        if l_new != l[w - 1]:
            if w not in Q:
                Q.append(w)
            l[w - 1] = l_new

    # Save for display
    my_v.append(v)

    print(Q)
    my_Q.append(copy.deepcopy(Q))

print(my_Q)
输出 我不一定知道您的算法试图实现什么,但这将在每次迭代时将
Q
的当前状态附加到
my_Q
,并且不允许调用
remove
来修改列表中已有的
Q
的实例

如果您不想使用deepcopy from copy,可以使用切片表示法来制作副本

#我的Q.append(copy.deepcopy(Q))
我的_Q.追加(Q[:])
您遇到了一个问题。Python会混淆您的实现,但是将一个列表附加到另一个列表只会添加一个引用,而不是列表的值

请尝试以下简单代码:

l=[]
a=[1,2]
l、 附加(a)
a、 删除(1)
l、 附加(a)
印刷品(l)
输出 在本例中,您希望看到类似于
[[1,2],[2]]
的内容,但是由于
a
只是
l
中的一个引用,因此在1上调用
remove
将其从
a
中删除外部变量及其在列表
l
中的引用

您可以
导入副本
并附加列表的深度副本

import copy
import random

# Matrix Input
M = 10 ** 3

G = [[M, 5, 9, M],
     [M, M, 1, 10],
     [M, M, M, 4],
     [M, M, M, M]]

# Initialize
Q = [1]
l = [0, M, M, M]
A = [1, 2, 3, 4]
iter = 0

# For display
my_v = [0]
my_Q = [1]

# Algorithm
while Q:  # Stop conditions

    iter += 1

    # Step 2:
    v = random.choice(Q)
    Q.remove(v)

    # Step 3:
    for w in A:
        l_new = min(l[w - 1], l[v - 1] + G[v - 1][w - 1])
        if l_new != l[w - 1]:
            if w not in Q:
                Q.append(w)
            l[w - 1] = l_new

    # Save for display
    my_v.append(v)

    print(Q)
    my_Q.append(copy.deepcopy(Q))

print(my_Q)
输出 我不一定知道您的算法试图实现什么,但这将在每次迭代时将
Q
的当前状态附加到
my_Q
,并且不允许调用
remove
来修改列表中已有的
Q
的实例

如果您不想使用deepcopy from copy,可以使用切片表示法来制作副本

#我的Q.append(copy.deepcopy(Q))
我的_Q.追加(Q[:])

您是在寻找一个平面列表(my_Q中的每个元素都是一个值)还是一个列表列表?我希望它是一个列表列表您是在寻找一个平面列表(my_Q中的每个元素都是一个值)还是一个列表列表?我希望它是一个工作完美的列表,非常感谢!我仍然不明白问题的实质是什么,谢谢你彻底地尝试回答;但是,这是一个常见问题,最好通过引用链接的副本(可能带有简短的解释性注释)来解决。另外,在讨论Python代码时,请不要谈论“指针”;这不是我们在Python中实际使用的抽象。这里有一个别名问题,是的,但它是由在多个位置存储相同列表对象的列表导致的。当我们谈论列表如何工作的秘密细节时,我们有时会说“参考”,而不是“指针”(除非我们正在处理C实现)。OP:如果你想“理解问题是什么”,你应该阅读链接副本。非常感谢!我仍然不明白问题的实质是什么,谢谢你彻底地尝试回答;但是,这是一个常见问题,最好通过引用链接的副本(可能带有简短的解释性注释)来解决。另外,在讨论Python代码时,请不要谈论“指针”;这不是我们在Python中实际使用的抽象。这里有一个别名问题,是的,但它是由在多个位置存储相同列表对象的列表导致的。当我们谈论列表如何工作的秘密细节时,我们有时会说“参考”,而不是“指针”(除非我们正在处理C实现)。OP:如果你想“理解问题是什么”,你应该阅读链接的副本。
[1, [2, 3], [3, 4], [3], [4], []]