zoukankan      html  css  js  c++  java
  • Python 函数参数传递机制.

    learning python,5e中讲到.Python的函数参数传递机制是对象引用.

    Arguments are passed by assignment (object reference). In Python, arguments
    are passed to functions by assignment (which, as we’ve learned, means by object
    reference). As you’ll see, in Python’s model the caller and function share objects
    by references, but there is no name aliasing. Changing an argument name within
    a function does not also change the corresponding name in the caller, but changing
    passed-in mutable objects in place can change objects shared by the caller, and
    serve as a function result.

    SO上有一个很好的说明:

    http://stackoverflow.com/questions/986006/python-how-do-i-pass-a-variable-by-reference

    The problem comes from a misunderstanding of what variables are in Python. If you're used to most traditional languages, you have a mental model of what happens in the following sequence:

    a =1
    a =2

    You believe that a is a memory location that stores the value 1, then is updated to store the value 2. That's not how things work in Python. Rather, a starts as a reference to an object with the value 1, then gets reassigned as a reference to an object with the value 2. Those two objects may continue to coexist even though a doesn't refer to the first one anymore; in fact they may be shared by any number of other references within the program.

    When you call a function with a parameter, a new reference is created that refers to the object passed in. This is separate from the reference that was used in the function call, so there's no way to update that reference and make it refer to a new object. In your example:

        self.variable = 'Original'
        self.Change(self.variable)
    
    def Change(self, var):
        var = 'Changed'
     

    self.variable is a reference to the string object 'Original'. When you call Change you create a second reference var to the object. Inside the function you reassign the reference var to a different string object 'Changed', but the reference self.variable is separate and does not change.

    The only way around this is to pass a mutable object. Because both references refer to the same object, any changes to the object are reflected in both places.

        self.variable = ['Original']
        self.Change(self.variable)
    
    def Change(self, var):
        var[0] = 'Changed'
  • 相关阅读:
    ArrayList removeRange方法分析
    LinkedHashMap源码分析(基于JDK1.6)
    LinkedList原码分析(基于JDK1.6)
    TreeMap源码分析——深入分析(基于JDK1.6)
    51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划
    51 NOD 1049 最大子段和 动态规划 模板 板子 DP
    51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
    8月20日 训练日记
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/xiangnan/p/3403539.html
Copyright © 2011-2022 走看看