【问题标题】:Modify parameter as a side-effect in python [duplicate]修改参数作为python中的副作用[重复]
【发布时间】:2012-11-22 05:05:34
【问题描述】:

可能重复:
Python: How do I pass a variable by reference?

我正在尝试编写一个函数来修改其中一个传递的参数。这是当前代码:

def improve_guess(guess, num): 
  return (guess + (num/guess)) / 2

x = 4.0
guess = 2.0
guess = improve_guess(guess, x)

但是,我想以不必进行最终分配的方式编写代码。这样,我就可以调用:

improve_guess(guess,x) 

并在猜测中获得新值。

(我故意没有提到通过引用传递,因为在我的网络搜索过程中,我发现了很多关于该主题的学术讨论,但没有明确的方法。我真的不想使用全局变量或为此封装在一个列表中。)

【问题讨论】:

  • improve_guess(3, x) - 你将如何“修改”3
  • 我们通常在 C 和 Java 中使用通过引用传递参数来执行此操作。这样,guess 参数就成为传入参数的别名。
  • 哦,我明白你的意思了,但我的用例只会处理变量。
  • "我们通常在 C 和 Java 中使用通过引用传递参数来执行此操作。"什么?你会如何在 Java 中做到这一点? “这样一来,guess 参数就变成了传入参数的别名。”在 C 或 Java 中没有这样的东西。

标签: python function parameter-passing


【解决方案1】:

您不能直接这样做,因为整数和浮点类型在 Python 中是不可变的。

可以guess 包装成某种可变结构(例如列表或自定义类),但这很快就会变得非常难看。

附:我个人真的很喜欢guess = improve_guess(guess, x) 的明确性质,因为它毫无疑问地明确了要修改的内容。我什至不需要知道任何关于 improve_guess() 的信息就能弄清楚。

【讨论】:

    【解决方案2】:

    但只有两种方法可以做到这一点:要么使用全局,要么使用像列表这样的可变类型。您不能在 Python 中修改非可变变量:这样做只会将本地名称重新绑定到新值。

    如果你真的不喜欢包装在一个列表中,你可以创建自己的类并传递一个可变的实例,但我看不出这样做有什么好处。

    【讨论】:

    • "这样做只是将本地名称重新绑定到一个新值" 赋值总是将变量重新绑定到一个新值。它与可变或不可变无关。 “您不能在 Python 中修改非可变变量” 变量不可变或不可变——变量指向的对象可以是。但是说你不能修改一个不可变的对象是一种重言式。
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2014-08-03
    • 2017-07-03
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多