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

Python:deepcopy(list)与new_list = old_list [:]

王才
2023-03-14
问题内容

我正在从http://openbookproject.net/thinkcs/python/english2e/ch09.html执行练习9
,但遇到了没有意义的问题。

该练习建议使用copy.deepcopy()来简化我的任务,但我不知道如何做到。

def add_row(matrix):
    """
        >>> m = [[0, 0], [0, 0]]
        >>> add_row(m)
        [[0, 0], [0, 0], [0, 0]]
        >>> n = [[3, 2, 5], [1, 4, 7]]
        >>> add_row(n)
        [[3, 2, 5], [1, 4, 7], [0, 0, 0]]
        >>> n
        [[3, 2, 5], [1, 4, 7]]
    """

    import copy
    # final = copy.deepcopy(matrix)  # first way
    final = matrix[:]                # second way
    li = []
    for i in range(len(matrix[0])):
        li.append(0)
    # return final.append(li)  # why doesn't this work?
    final.append(li)            # but this does
    return final

我很困惑为什么这本书建议deepcopy()在简单list[:]复制时使用它。我使用错了吗?我的功能完全不正常吗?

我也有一些困惑返回值。问题是上面代码中的文档。

TIA


问题答案:

您问了两个问题:

深层副本与浅层副本

matrix[:]是一个 浅表副本 -仅复制直接存储在其中的元素,而不递归地复制数组或内部其他引用的元素。这意味着:

a = [[4]]
b = a[:]
a[0].append(5)
print b[0] # Outputs [4, 5], as a[0] and b[0] point to the same array

如果将对象存储在中,也会发生同样的情况a

deepcopy()自然地,它是一个 深层副本 -它递归地在树上一直递归复制其每个元素的副本:

a = [[4]]
c = copy.deepcopy(a)
a[0].append(5)
print c[0] # Outputs [4], as c[0] is a copy of the elements of a[0] into a new array

归来

return final.append(li)与调用append和返回不同,final因为list.append不返回列表对象本身,而是返回None



 类似资料:
  • 10.List与Adapter 在本章,你将学到选择性控件(比如ListView)的创建方法。但是这里讨论的重点绝对不在用户界面,而在于进一步巩固我们在上一章中对“数据”的理解——前面是简单地读取数据再输出到屏幕,到这里改为使用Adapter直接将数据库与List绑定在一起。你可以创建一个自己的Adapter,从而添加额外的功能。在此,我们新建一个 Activity ,并将它作为用户发送/阅读消息

  • 问题内容: 在以下示例中,我希望Deepcopy可以创建字段的副本,而不仅仅是复制引用。这里发生了什么,有什么简单的方法可以解决? 输出: 问题答案: 深层复制(默认情况下)仅适用于实例级别的属性-不适用于类级别-唯一的多个含义并没有多大意义… 将您的代码更改为:

  • 问题内容: 考虑以下: 和: 有没有使用任何好处或-应了另一种在某些情况下使用? 问题答案: 对于空列表,我建议使用。这样会更快,因为它避免了对内置name的名称查找。内置名称也可以被全局或本地名称覆盖;这只会影响,不会。 但是,内置函数可用于将其他一些可迭代对象转换为列表: 为了完整起见,我机器上的空列表的两个选项的时间安排(Python 2.7.3rc2,Intel Core 2 Duo):

  • 5.8.第五部分: List与Adapter 听名字像是回头复习UI了,但List与Adapter与众不同。作为控件,它们允许我们将大量的数据集与小屏幕上的显示绑定在一起,且不失高效性与伸缩性。从用户的角度来看,得到的好处就是Yamba不会因为运行时间的增长而变慢。 数据都已保存在了数据库中,但还没有办法显示出来。在此我们为 Yamba 设计一个显示Timeline的界面,方便用户查看朋友消息。

  • Rotate List 描述 Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->nullptr and k = 2, return 4->5->1->2->3->nullptr. 分析 先遍历一遍,得出链表长度len,注

  • Reorder List 描述 Given a singly linked list $$L: L0 \rightarrow L_1 \rightarrow \cdots \rightarrow L{n-1} \rightarrow Ln$$, reorder it to: $$L_0 \rightarrow L_n \rightarrow L_1 \rightarrow L{n-1} \righ

  • Partition List 描述 Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the n

  • Reverse Linked List 描述 Reverse a singly linked list. 分析 用双指针 p, q,不断前进。 解法 1 迭代 // Reverse Linked List // Time Complexity: O(n), Space Complexity: O(1) class Solution { public ListNode reverseList