为了账号安全,请及时绑定邮箱和手机立即绑定

为什么函数可以修改调用者感觉到的某些参数,而不能修改其他参数呢?

为什么函数可以修改调用者感觉到的某些参数,而不能修改其他参数呢?

慕容708150 2019-06-05 15:51:03
为什么函数可以修改调用者感觉到的某些参数,而不能修改其他参数呢?我正在尝试理解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]
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

一些答案包含函数调用上下文中的“复制”一词。我觉得很困惑。

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中的名称之间的差异.


查看完整回答
反对 回复 2019-06-05
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

f的值并不会改变x(对列表实例的引用总是相同的)。相反,它改变了内容在这个名单上。

在这两种情况下,a引用的副本传递给函数。在功能内部,

  • n

    获取分配的新值。只修改函数内部的引用,而不是修改函数外部的引用。
  • x

    不分配新值:函数内部和外部的引用都不会被修改。相反,

    x

    价值

    被修改了。

因为x函数内部和外部引用相同的值,都可以看到修改。相反,n函数内部和外部指的是异类后值n在职能范围内重新分配。


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 670 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信