当前位置: 首页 > 面试题库 >

为什么函数可以修改调用者认为的某些自变量,而不能修改其他自变量?

佟和平
2023-03-14
问题内容

我正在尝试了解Python的可变范围方法。在此示例中,为什么f()能够更改的值(x如在其中看到的)main(),但不能更改的值n?

def f(n, x):
    n = 2
    x.append(4)
    print('In f():', n, x)

def main():
    n = 1
    x = [0,1,2,3]
    print('Before:', n, x)
    f(n, x)
    print('After: ', n, x)

main()

输出:

Before: 1 [0, 1, 2, 3]
In f(): 2 [0, 1, 2, 3, 4]
After:  1 [0, 1, 2, 3, 4]

问题答案:

一些答案在函数调用的上下文中包含单词“ copy”。我感到困惑。

Python不复制对象的函数调用中传递过。

功能参数是名称。调用函数时,Python会将这些参数绑定到您传递的任何对象上(通过调用方作用域中的名称)。

对象可以是可变的(如列表)或不可变的(如Python中的整数,字符串)。您可以更改可变对象。您不能更改名称,只需将其绑定到另一个对象即可。

您的示例与作用域或名称空间无关,而与Python中对象的命名,绑定和可变性有关。

def f(n, x): # these `n`, `x` have nothing to do with `n` and `x` from main()
    n = 2    # put `n` label on `2` balloon
    x.append(4) # call `append` method of whatever object `x` is referring to.
    print('In f():', n, x)
    x = []   # put `x` label on `[]` ballon
    # x = [] has no effect on the original list that is passed into the function


 类似资料:
  • 问题内容: 我正在尝试了解Python的可变范围方法。在此示例中,为什么能够更改在x内部感知到的值,但不能更改? main() 输出: 问题答案: 一些答案在函数调用的上下文中包含单词。我感到困惑。 Python不复制对象的函数调用中传递过。 功能参数是名称。调用函数时,Python会将这些参数绑定到你传递的任何对象上(通过调用方作用域中的名称)。 对象可以是可变的(如列表)或不可变的(如Pyth

  • 问题内容: public class StackOverFlow { public static void main(String[] args) { ArrayList al = new ArrayList (); al.add(“A”); al.add(“B”); markAsNull(al); System.out.println(“ArrayList elements are “+al);

  • 我知道这是异步性,但我已经遵循了添加回调函数的步骤,为什么我的变量在函数中修改后没有改变呢?-异步代码引用,但我只能访问回调函数内部的更改。这是我的代码片段。请帮忙

  • 问题内容: 给定以下示例,为什么在所有情况下都未定义? 为什么undefined在所有这些示例中都输出?我不需要解决方法,我想知道为什么会这样。 注意:这是JavaScript异步性的典型问题。随时改进此问题,并添加更多简化的示例,社区可以识别。 问题答案: 一句话回答:异步性。 问题的答案 让我们首先跟踪常见行为。在所有示例中,都在函数内部修改了。该函数显然不会立即执行,而是被分配或作为参数传递

  • 我很惊讶地看到这个程序甚至可以编译,但结果更让我惊讶: 交换功能在库中实现为: 其中是一个可变的Java列表,而不是不可变的静态编程语言列表。所以我认为其他Java函数也可以工作。例如: 工作,但其他函数,例如函数,甚至不编译: 生成以下错误消息: 类型推断失败:趣味填充(p0:可变列表!,p1:T!):无法将单位应用于(List,Int)类型不匹配:推断的类型为List,但为MutableLis