同一性和切片副本

Posted cnhkzyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同一性和切片副本相关的知识,希望对你有一定的参考价值。

  《python基础教程(第2版)》中有两个例子,可以解释同一性和副本的有关概念,现举例如下:

‘‘‘

  字符串(以及数字和元组)是不可变的,即无法被修改(也就是说只能用新的值覆盖)。所以它们做参数的时候也就无需多做介绍。但是考虑一下如果将可变的数据结构如列表用作参数的时候会发生什么:

 

def change(n):
    n[0] = Mr. Gumby

names = [Mrs. Entity, Mrs. Thing]
change(names)

names
[Mr. Gumby, Mrs. Thing]      

 

‘‘‘

  我们发现,参数被改变了,我们可以分析一下,为什么参数会被改变:

                                                  n---------names--------列表[‘Mrs. Entity‘, ‘Mrs. Thing‘]

  其中names和n都同时引用了同一个列表。那么,n如果发生变化,names也势必发生变化。

 

  为了避免这种情况,我们可以复制一个列表的副本:

 

def change(n):
    n[0] = Mr. Gumby

names = [Mrs. Entity, Mrs. Thing]
change(names[:])

names
[Mrs. Entity, Mrs. Thing]
>>> names[:] is names
False
>>> names[:] == names
True

                                                                                                                         

                                                        n---------names[:]副本 <-----------names------------列表[‘Mrs. Entity‘, ‘Mrs. Thing‘]     

  现在参数n对应的是一个副本,而副本和names不同一,所以原始的列表是安全的。             

 

以上是关于同一性和切片副本的主要内容,如果未能解决你的问题,请参考以下文章

切片表示法不会在内存中创建新副本

试图在 DataFrame 中的切片副本上设置一个值

大熊猫中的切片和副本有啥区别? [复制]

为啥 Python 3 中的切片仍然是副本而不是视图?

你知道的Go切片扩容机制可能是错的

Pandas DataFrame:SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置一个值 [重复]