gpt4 book ai didi

python - 理解 Python 传递函数参数的对象调用风格

转载 作者:太空狗 更新时间:2023-10-29 17:24:52 26 4
gpt4 key购买 nike

<分区>

我不确定我是否理解 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 数组等),是否有任何快速的经验法则识别哪些参数将通过引用传递,哪些参数通过值传递?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com