首页 > 解决方案 > 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解释吗?

标签: pythonr

解决方案


我不能说 R 是如何传递参数的,但是对于编程语言(包括 Python)来说,对可变对象的突变反映在执行突变的函数之外是很常见的。Java、C# 和其他支持 OOP(面向对象编程)的流行语言也采用这种方式。

像这样的列表[1]是可变对象,因此您可以在函数之外看到这种突变。这种类型的行为使面向对象的编程更加方便。

如果不希望出现这种行为,请考虑在 python 中使用函数式编程风格(不可变对象、、、、mapfilterreduce将可变对象的副本传递给函数。

我认为这里发生的事情与它是否是pythonic无关。这是一种语言机制:仅此而已。


推荐阅读