python,如何通过copy()获得互不影响的ndarray复制品?
发布于 作者:苏南大叔 来源:程序如此灵动~

编程语言越高级,就越容易发生一些不可控的奇异事件。其中,一些奇异事件的典型代表就是变量复制,使用传统的=
操作符对于高级类型的变量来说,不是生成一个新的值,而仅仅是变量引用,是同一个变量!那么,接下来引发的问题就是:改变原值的时候,后面的被等号处理的新变量也发生了改变!

大家好,这里是苏南大叔的程序如此灵动博客,本文讲述python
代码中的ndarray
的变量复制问题。测试环境:win10
,python@3.11.0
,numpy@1.24.2
,pandas@1.5.3
。
问题重现
这里就重现一下"="处理新的变量的情况:
测试用例:
输出:
从输出上来看,
- 作为备份的
s_
被修改了,【不符合预期】,numpy.ndarray
类型。 - 作为切片的
s1
被修改了,【不符合预期】,numpy.ndarray
类型。 - 作为切片的
s2
没有被修改,【符合预期】,numpy.str_
类型。

s1
和s2
同时作为切片,一个被修改另外一个确没有被修改,最大的主因就是数据类型。只要是数据类型是ndarray
,使用等号建立的新变量,就是引用,就存在着问题。
解决方案
解决方案就是.copy()
,新的变量的创建使用ndarray.copy()
,而不是使用传统的等号。
输出:

从运行结果上来看,使用.copy()
形成的新变量,完全脱离了原变量的控制。原ndarray
的成员修改,并不会影响其复制版变量的值。符合预期。
字符串.copy()
按理说,字符串是没有.copy()
方法的。但是作为ndarray
切片存在的s2
变量是被numpy
包装过的numpy.str_
对象。所以,存在即为合理。
测试用例:
错误输出:

相关文章
结束语
更多python
相关文章,请点击苏南大叔的相关经验文章链接:


