Python 将条目追加到数组会导致以前的所有条目都更改为最新条目
我尝试获取一个3位数的数字,然后按以下顺序生成子项: A.从第一个数字中减去1 B第一位数字加1 C从第二个数字中减去1 D第二位数字加1 E从第三个数字中减去1 f、 第三位数字加1 如果为0,则不减;如果为9,则不加 这是我用来做这件事的代码,其中p是一个3位数的数组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
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]