为什么用 [:] 复制列表(由函数调用)不起作用?

Why copying lists (which are called by functions) with [:] doesn't work?

提问人:Emre Sagbas 提问时间:11/11/2022 最后编辑:Karl KnechtelEmre Sagbas 更新时间:11/11/2022 访问量:27

问:

我有两个列表,例如:

prelist = [0, 0, 0, 0, 0]

postlist = [50.0, 25.0, 12.5, 6.25, 3.125]

我尝试像这样复制列表:

prelist = postlist[:]

但是周围的代码不起作用。 当我以这种方式复制列表时,我得到了所需的结果:

for i in range(5):
    prelist[i] = postlist[i]

第一种方法有什么问题?

Python 数组 列表 复制 通过引用传递

评论

0赞 Karl Knechtel 11/11/2022
欢迎来到 Stack Overflow。写作肯定会复制列表。最有可能的是,问题在于其他知道已经命名的现有列表的代码不会意识到更改 - 因为我们创建了一个作为副本的新列表,而不是修改现有列表。但是,如果没有适当的最小可重现示例,就无法具体说明。请阅读如何提问,并注意这不是一个讨论论坛;我们无法为您对您的代码库进行探索性工作。prelist = postlist[:]prelistprelist
0赞 Ben Grossmann 11/11/2022
@Erme 你能更准确地说明你到底尝试了什么没有成功吗?如果您可以编写一个简短的函数,我们可以尝试该函数,从而导致相同的行为,那将会有所帮助
1赞 Karl Knechtel 11/11/2022
编辑了这个问题,删除了所有无关紧要的内容。下一步是添加缺少的东西:周围没有工作的代码是什么?应该发生什么,但发生了什么?特别是因为你承认你有点超出了你的深度,展示是非常重要的,不要说也不猜——像“调用到函数中”这样的描述,除了不是术语的合理使用之外,还不足以描述。
0赞 Emre Sagbas 11/11/2022
谢谢你的建议,卡尔。我不是想让别人在我的代码库上工作,我只是想理解为什么它会这样工作。但我知道我提供了缺乏的信息,所以我明白这就是为什么人们很难向我解释问题是什么或根本就有问题的原因。我将尽我所能在以后提出更好的问题。我对这个问题感到沮丧,因为在过去的 4 个小时里我一直在尝试解决这个小问题。我将来会尽量解释性更强。

答:

0赞 user2357112 11/11/2022 #1

当和引用两个列表时,表示使列表引用的副本,然后使引用的新副本代替它用来引用的列表。用于引用的列表完全不受影响。该列表独立于变量而存在,并且根本不参与此操作。ABB = A[:]ABABB

听起来你正在寻找 ,它将内容复制现有列表中引用,而不是制作新列表。B[:] = AAB

(请注意,切片在作业的左侧和右侧表示不同的含义。在右侧,计算为表达式将创建一个新列表。在左侧,指定将元素复制到现有列表中。[:]A[:]B[:]

评论

0赞 Karl Knechtel 11/11/2022
一旦问题添加了适当的信息,这似乎就有可能回答潜在的问题;但在这种情况下,它似乎很可能是重复的。当然,我们已经有一些东西来解释什么是以及如何使用它?鉴于这有多重要?B[:] = A
0赞 user2357112 11/11/2022
@KarlKnechtel:也许吧,但仅仅解释什么确实不能很好地解决问题。我认为重要的是要清楚地解释两者的作用,并强调其中的区别。我通常看到的与切片相关的问题的通用欺骗目标并不能有效地消除特定的误解。B[:] = AB = A[:]B[:] = A
0赞 Karl Knechtel 11/11/2022
不可能有那么多明显的“具体误解”,因为我们在这个话题上得到了问题。我们迫切需要找出适当的规范。(无论如何,我认为这里的误解根本不是关于切片的,而是关于Python的赋值语义,更一般地说是关于“引用语义”。