我不确定我是否理解 Python 通过传递函数参数的对象风格调用的概念(在此处解释http://effbot.org/zone/call-by-object.htm)。似乎没有足够的例子来很好地阐明这个概念(或者我的 google-fu 可能很弱!:D)
我写了这个小小的 Python 程序来试图理解这个概念
def foo( itnumber, ittuple, itlist, itdict ):
itnumber +=1
print id(itnumber) , itnumber
print id(ittuple) , ittuple
itlist.append(3.4)
print id(itlist) , itlist
itdict['mary'] = 2.3
print id(itdict), itdict
# Initialize a number, a tuple, a list and a dictionary
tnumber = 1
print id( tnumber ), tnumber
ttuple = (1, 2, 3)
print id( ttuple ) , ttuple
tlist = [1, 2, 3]
print id( tlist ) , tlist
tdict = tel = {'jack': 4098, 'sape': 4139}
print '-------'
# Invoke a function and test it
foo(tnumber, ttuple, tlist , tdict)
print '-------'
#Test behaviour after the function call is over
print id(tnumber) , tnumber
print id(ttuple) , ttuple
print id(tlist) , tlist
print id(tdict), tdict
程序的输出是
146739376 1
3075201660 (1, 2, 3)
3075103916 [1, 2, 3]
3075193004 {'sape': 4139, 'jack': 4098}
---------
146739364 2
3075201660 (1, 2, 3)
3075103916 [1, 2, 3, 3.4]
3075193004 {'sape': 4139, 'jack': 4098, 'mary': 2.3}
---------
146739376 1
3075201660 (1, 2, 3)
3075103916 [1, 2, 3, 3.4]
3075193004 {'sape': 4139, 'jack': 4098, 'mary': 2.3}
如您所见,除了传递的整数之外,对象 id(据我所知是指内存位置)保持不变。
因此,在整数的情况下,它(有效地)通过值传递,而其他数据结构(有效地)通过引用传递。我尝试更改 list 、 number 和 dictionary 来测试数据结构是否已就地更改。数字不在列表中,字典在。
我在上面有效地使用了这个词,因为参数传递的“按对象调用”样式似乎具有两种方式,具体取决于上面代码中传递的数据结构
对于更复杂的数据结构(比如 numpy 数组等),是否有任何快速的经验法则来识别哪些参数将通过引用传递,哪些参数将通过值传递?