python - python vs. R 作用域
问题描述
我试图理解为什么我在 R 中的两个不同函数与 python 中的相同(?)实现中得到不同的输出。
Python:
def increment(n):
n = n + 1
print(n)
n = 1
increment(n)
print(n)
2
1
def increment2(x):
x[0] = x[0] + 1
print(x)
n = [1]
increment2(n)
print(n)
2
2
回复:
increment <- function(n){
n = n + 1
print(n)
}
n = 1
increment(n)
2
print(n)
1
increment2 <- function(n){
n[1] = n[1] + 1
print(n)
}
n = c(1)
increment2(n)
2
print(n)
1
在我看来,R 输出似乎更一致。一切都在函数内部,不要跑到外面(除非我返回并将输出分配回 n)。任何人都可以给我一个pythonic解释吗?
解决方案
我不能说 R 是如何传递参数的,但是对于编程语言(包括 Python)来说,对可变对象的突变反映在执行突变的函数之外是很常见的。Java、C# 和其他支持 OOP(面向对象编程)的流行语言也采用这种方式。
像这样的列表[1]
是可变对象,因此您可以在函数之外看到这种突变。这种类型的行为使面向对象的编程更加方便。
如果不希望出现这种行为,请考虑在 python 中使用函数式编程风格(不可变对象、、、、map
)filter
或reduce
将可变对象的副本传递给函数。
我认为这里发生的事情与它是否是pythonic无关。这是一种语言机制:仅此而已。
推荐阅读
- flutter - Cocoapods 兼容性错误 - 运行 pod install 时出错
- excel - 如何复制一定数量的值,然后在 Excel 中更改为另一个
- ios - 如何在 react-native-webview 中使用 blob url 下载 pdf
- python-telegram-bot - Python Telegram Bot - 如何将 JSON response.content 作为 PDF 文件发送
- c# - 如何通过@Html.TextBoxFor 搜索产品,这个(@Html.TextBoxFor)在表格的一行中
- python - Python:无法替换列表中的项目,原因是:TypeError:列表索引必须是整数或切片,而不是 str
- r - 如何在ggplot2中导入手绘形状?(“ggplot2 图画书”)
- vim - 我已经按照存储库中的说明逐步在 Windows 中安装了 vim vundle,但是当我打开任何 vim 文件时出现错误
- swift - 如何获得返回的特定结构类型?
- javascript - 手风琴菜单不适用于 prettyphoto