list 封装的 copy 方法实现对列表的浅拷贝

2021-01-12 17:51:51 +08:00
 fanqieipnet
list 封装的 copy 方法实现对列表的浅拷贝,浅拷贝只拷贝一层,到底是怎么回事呢?今天番茄加速就来讲一下。

   In [38]: c =[1,3,5]

   In [39]: cc = c.copy()

   c 和 cc 分别指向一片不同内存,这样修改 cc 的第一个元素,原来 c 不受影响:

   In [40]: cc[0]=10 # 修改 cc 第一个元素

   In [41]: cc

   Out[41]: [10, 3, 5]

   In [42]: c # 原来 c 不受影响

   Out[42]: [1, 3, 5]

  但是,如果内嵌一层列表,再使用 copy 时只拷贝一层:

   In [32]: a=[[1,3],[4,2]]

   In [33]: ac = a.copy()

   In [34]: ac

   Out[34]: [[1, 3], [4, 2]]

  内嵌的列表并没有实现拷贝。因此再修改内嵌的元素时,原来的列表也会受到影响。

   In [35]: ac[0][0]=10

   In [36]: ac

   Out[36]: [[10, 3], [4, 2]]

   In [37]: a

   Out[37]: [[10, 3], [4, 2]]

  要想实现深度拷贝,需要使用 Python 模块 copy 中的 deepcopy 方法。

  列表可变性

  列表是可变的,可变的对象是不可哈希的,不可哈希的对象不能被映射,因此不能被用作字典的键。

   In [51]: a=[1,3]

   In [52]: d={a:'不能被哈希'} #会抛出如下异常

  # TypeError: unhashable type: 'list'

  但是,有时我们确实需要列表对象作为键,这怎么办?

  可以将列表转化为元祖,元祖是可哈希的,所以能作为字典的键。
501 次点击
所在节点    推广
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744283

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX