在Python中传递值

这个问题在这里已经有了答案:

  • 如何通过引用传递变量? 23个答案

  • Python通过值传递引用到对象。

    Python通过值传递引用到对象(如Java),而Python中的所有东西都是一个对象。 这听起来很简单,但您会注意到某些数据类型似乎具有传递值特性,而其他数据类似于传递引用......这是怎么回事?

    理解可变对象和不可变对象很重要。 一些对象,如字符串,元组和数字是不可变的。 在函数/方法内改变它们会创建一个新的实例,并且函数/方法之外的原始实例不会改变。 其他对象,如列表和字典是可变的,这意味着你可以在原地更改对象。 因此,改变函数/方法内的对象也会改变原始对象的外部。


    事情是,整个参考/价值概念不适合python。 Python没有变量的“价值”。 Python只有引用对象的对象和名称。

    所以当你调用一个函数并在括号内放置一个“名字”时,就像这样:

    def func(x): # defines a function that takes an argument
        ... # do something here
    
    func(myname) # calling the function
    

    myname指向的实际对象被传递,而不是名称 myname 本身 。 在函数内部给出另一个名字x )来引用传递的同一个对象。

    如果函数是可变的,您可以修改函数内的对象,但不能更改外部名称指向的内容 。 就像你做这件事一样

    anothername = myname
    

    因此我可以用以下答案回答你的问题

    它是“按值传递”,但所有值都只是对象的引用。


    这里的答案很有帮助,但是我发现需要展现我未见过的这种美好的区别,我已经通过随后的CL实验证明了这一点:

  • 不可变对象ALONE不能在函数调用中更改。 (到目前为止的答案已经说了很多......)
  • 但是,包含在可变对象中的不可变对象可以在方法调用中重新分配。
  • 'num'在这里没有改变,因为它是一个不可变的Number对象[支持我的要点1]:

    def incr_num(num):
        num += 1
    
    num = 0
    
    num
    0
    
    incr_num(num)
    
    num
    0
    

    'list [0]'这里也是一个不可变的Number对象。

    def incr_list(list):
        list[0] += 1
    
    list = [0]
    
    list[0]
    0
    
    incr_list(list)
    
    list[0]
    1
    

    那么作为一个不可变的Number对象的'list [0]'是如何改变的(支持我的第2点),而上面的例子的Number对象'num'没有改变? 不可变的Number对象'list [0]'包含在可变列表对象'list'中,而来自第一个例子的'num'只是一个不确定的Number对象。

    虽然意图很好,但我觉得@Stephen Pape评价最高的答案(以下引用)和其他一些类似的答案并不完全正确(并且这促使我写这个答案):

    一些对象,如字符串,元组和数字是不可变的。 在函数/方法内改变它们会创建一个新的实例,并且函数/方法之外的原始实例不会改变。

    我上面的第二个代码实验显示了一个Number对象('list [0]')在一个方法中被改变,然后原来的函数改变了。

    链接地址: http://www.djcxy.com/p/3537.html

    上一篇: Passing values in Python

    下一篇: Where is the mutability of Objects defined in ECMAScript?