我不确定我是否理解Python的按对象传递函数参数的概念(在此处讲解:http://effbot.org/zone/call-by-object.htm)。似乎没有足够的示例来很好地澄清这个概念(或者我的搜索能力可能很弱!: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(我理解为内存位置)保持不变。
因此,在整数的情况下,它被(有效地)按值传递,而其他数据结构则被(有效地)按引用传递。我尝试更改列表、数字和字典以测试数据结构是否会就地更改。数字没有被更改,但列表和字典被更改了。
我在上面使用"effectively"一词,因为"按对象调用"的参数传递方式似乎根据传递的数据结构而有不同的行为。
对于更复杂的数据结构,例如numpy数组等,有没有什么快速的经验法则来识别哪些参数将按引用传递,哪些按值传递?