python-3.x - Numpy __isub__ 改变全局变量
问题描述
在最近的一个脚本中,我一直在努力对 NumPy 数组和函数进行一些操作。我终于发现了似乎是错误的地方:NumPy __isub__。
这是一个例子:
def test(apocalypse):
apocalypse = apocalypse - 3
return apocalypse
def test2(apocalypse):
apocalypse -= 3
return apocalypse
foo = np.array([1,2,3])
print(test(foo))
print(foo)
bar = np.array([1,2,3])
print(test2(bar))
print(bar)
结果是:
[-2 -1 0]
[1 2 3]
[-2 -1 0]
[-2 -1 0]
是预期的吗?应该-=
更改全局变量(对于 相同+=
)?我尝试过使用 int 和 float 而不是 NumPy 数组,它按预期工作。
解决方案
发布答案以防万一有人需要比hpaulj和Willem Van Onsem快速而好的答案更多的细节。
我假设我们已经了解可变/不可变对象是如何工作的。如果不是,这里我们有一个关于它的答案,在引用与分配上下文中。
我面临的问题是由于isub是一个就地运算符并且它与可变对象一起使用,因此通过赋值传递给test
函数的原始变量的对象已更改,与我认为的全局变量无关.
请注意,正如我们所看到的,并不是因为您有一个可变对象,所有操作都会就地更改该对象。示例id
:
arr = np.array([1,2,3])
print(id(arr)) # prints 139838225358560
arr += 3
print(arr) # prints [4 5 6]
print(id(arr)) # prints 139838225358560
arr = arr + 3
print(arr) # prints [7 8 9]
print(id(arr)) # prints 139838016018832
就地操作符在赋值创建一个新+=
对象时执行对象的更改。我的问题也是如此,分别是 和 。arr
=
apocalypse -= 3
apocalypse = apocalypse - 3
Python 文档对就地运算符及其列表进行了简短而良好的解释。
推荐阅读
- java - spring webclient签署一个body请求
- bash - 使用 Shell 脚本以“自定义顺序”重新排列文本文件的列
- java - How to write a lambda expression when you are using a string array?
- python - 在google Big-query中设置IAM策略时如何检查用户是否存在?
- python - 在 python 中使用地理空间数据
- git - 为什么我不能在不指定分支的情况下将 HEAD^ 推送到原点?
- ios - 我们是否需要 iOS Xcode 中的 Storyboard ID
- java - 当我在移动设备上同时在网站上运行自动化测试时,如何仅捕获一个屏幕截图?
- ssl - 将 Nexus-IQ 配置为使用 .pfx 证书
- java - 使用 JUnit 测试 Java 服务器-客户端应用程序(或尝试)