当前位置: 首页 > 面试题库 >

python中列表的奇怪行为

宋岳
2023-03-14
问题内容

我不了解python中列表的行为:

>>> a1 = [[0,0],[0,0]]
>>> a2 = [[0]*2]*2
>>> a1
[[0, 0], [0, 0]]
>>> a2
[[0, 0], [0, 0]]
>>> a1[0][0] = 1
>>> a2[0][0] = 1
>>> a1
[[1, 0], [0, 0]]
>>> a2
[[1, 0], [1, 0]]

为什么一个元素的分配影响另一个元素?感谢您的回答!


问题答案:

当您将一个列表相乘时,它会复制对该列表的引用,但不会创建该列表的副本。由于列表是可变的,因此在更改列表时,所有对其引用的引用都会更改。

用ASCII术语来说:

a1 --- [list1, list2] --- list1 = [0, 0]
                      --- list2 = [0, 0]

a2 --- [list3, list3] --- list3 = [0, 0]

您可以清楚地看到更改list3将同时影响两个位置。

如果要创建可变长列表而不复制引用,则应执行以下操作:

>>> a2 = [[0]*2 for _ in range(2)]
>>> a2[0][0] = 1
>>> a2
[[1, 0], [0, 0]]

在这里,我们使用列表理解来每次创建新元素,而不是复制对旧元素的引用。在更复杂的情况,在那里你必须要重复现有的可变对象,您可能需要使用的copy模块。

请注意,该[0]*2操作仍然可以,因为intPython中的s是不可变的,并且不能更改,因此,如果您具有对同一对象的引用,则无所谓。



 类似资料:
  • 问题内容: 在Python(2.7)中发现了从未有过的有趣的东西。 这个: 确实有效,结果是: 但 给 有人可以解释为什么吗?感谢您的回答。 问题答案: Python区分和运算符,并为它们提供了单独的挂钩。和。该类型只是为后者提供了不同的实现。 列表分别实现这些功能更为有效;必须返回一个全新的列表,而可以扩展然后返回。 在C代码中,是由所实现的,该只需调用,或者在python代码中,由。后者根据设

  • 问题内容: 我有以下简单代码: 正如我的python知识所期望的那样,输出为3-整个列表将包含的最后一个值。但是,这在内部如何运作? AFAIK,python变量只是对对象的引用,因此第一个闭包必须包含对象的第一个引用-并且此对象肯定是1,而不是3 O_O。python闭包如何将变量本身而不是对象作为变量引用的对象?它是否将变量名另存为纯文本,一些“对变量的引用”或什么? 问题答案: 闭包不是指

  • 这些数字是,这正是我所期望的。 我完全搞不懂这两个案子的情况。有人能解释清楚吗?

  • 我在http://www.nodebeginner.org上读了一篇教程,我在数据输出中有一个奇怪的行为。我知道,Stackoverflow也有类似的问题,但没有答案。所以我有这个Web-Server的代码: 调用RequestHandler.Upload的Router.js代码-我的buggy函数 和RequestHandler.Upload的代码 假设POST数据中有一个字符串。该函数的第一行

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 关于正则表达式有一个问题,试图回答我发现了另一个奇怪的事情。 这将打印YY。为什么?? 这会打印YXY 为什么勉强的正则表达式与“ X”字符不匹配?有,但为什么第一次不匹配三个符号和匹配的是两个,然后一个而不是三个?和第二个正则表达式仅匹配s而不匹配? 问题答案: 让我们依次考虑它们: 有两个匹配项: 在字符位置0处被匹配,并被替换为。 在字符位置1,空字符串被匹配,并被添加到输出中。