Python 将条目追加到数组会导致以前的所有条目都更改为最新条目

Python 将条目追加到数组会导致以前的所有条目都更改为最新条目,python,arrays,Python,Arrays,我尝试获取一个3位数的数字,然后按以下顺序生成子项: A.从第一个数字中减去1 B第一位数字加1 C从第二个数字中减去1 D第二位数字加1 E从第三个数字中减去1 f、 第三位数字加1 如果为0,则不减;如果为9,则不加 这是我用来做这件事的代码,其中p是一个3位数的数组 def generate_children(p): children = [] i=0 for x in p: if x != 0: child1 = p

我尝试获取一个3位数的数字,然后按以下顺序生成子项: A.从第一个数字中减去1 B第一位数字加1 C从第二个数字中减去1 D第二位数字加1 E从第三个数字中减去1 f、 第三位数字加1

如果为0,则不减;如果为9,则不加

这是我用来做这件事的代码,其中p是一个3位数的数组

def generate_children(p):
    children = []
    i=0
    for x in p:
        if x != 0:
            child1 = p
            child1[i] = child1[i]-1
            children.append(child1)
            print(children)
        if x != 9:
            child2 = p
            child2[i] = child2[i] + 1
            children.append(child2)
            print(children)
        i+=1
    return children
如果我给它一个345的父项,它应该在最后返回[245445335335534346]。然而,当我用print语句运行它时,它会给出下面的结果。为什么数组中的每个条目在追加后都会变得相同

[2,4,5]]

[3,4,5],[3,4,5]]

[3,3,5],[3,3,5],[3,3,5]]

[3,4,5],[3,4,5],[3,4,5],[3,4,5]]

[3,4,4],[3,4,4],[3,4,4],[3,4,4],[3,4,4]]

[3,4,5],[3,4,5],[3,4,5],[3,4,5],[3,4,5],[3,4,5],[3,4,5]。

使用列表。复制()
def生成子项(p):
儿童=[]
i=0
对于p中的x:
如果x!=0:
child1=p.copy()
child1[i]=child1[i]-1
children.append(child1)
印刷品(儿童)
如果x!=9:
child2=p.copy()
child2[i]=child2[i]+1
children.append(child2)
印刷品(儿童)
i+=1
返回儿童
在python中,如果将一个名称绑定到一个列表,它不会复制该列表,而是指向同一个内存插槽

a = [1, 2, 3]
# a -----> [1, 2, 3]

b = a
# a -----> [1, 2, 3]
#          ^
#          |
# b --------

a[1] = 4
# a -----> [1, 4, 3]
#          ^
#          |
# b --------
print(b)  # [1, 4, 3]
如果使用
list.copy()

您的代码是: 您可以在此处可视化代码的行为:

固定代码: 您可以在此处可视化固定代码的行为:


什么是
p
的数据类型?如果您提供调用此函数的代码会更好。这是否回答了您的问题@Manuel我认为这对OP没有帮助,因为在这种情况下,它是
*
操作如何对列表工作的一个微妙之处,而在这种情况下,它与变量/引用与值之间的混淆有关。@augurar我认为这是同一个问题,只是创建了不同的问题,我认为理解这个问题就像在另一个情况下解释的那样(即,所有子列表都是相同的列表对象)也将使他们理解此列表。
a = [1, 2, 3]
# a -----> [1, 2, 3]

b = a.copy()
# a -----> [1, 2, 3]
# b -----> [1, 2, 3]

a[1] = 4
# a -----> [1, 4, 3]
# b -----> [1, 2, 3]

print(b)  # [1, 2, 3]