很多人说,在Python函数的参数使用的是呼叫按值传递模型。 据我所知,它实际上不是一个呼叫按值的语言,但是呼叫的对象或调用的共享模式。
什么是呼叫按值模型和呼叫按对象模型之间的区别是什么? 什么是Python中,显示这些模型是如何不同的例子吗?
很多人说,在Python函数的参数使用的是呼叫按值传递模型。 据我所知,它实际上不是一个呼叫按值的语言,但是呼叫的对象或调用的共享模式。
什么是呼叫按值模型和呼叫按对象模型之间的区别是什么? 什么是Python中,显示这些模型是如何不同的例子吗?
说是不及格按值是不正确的。 语义上,它是通过按值,和一个能证明它和其他通按值语言之间的语义等价。 然而,它属于通过噪声值的语言,所有的值都引用(指针)对象的特定子类(你不能有一个对象作为直接的值),许多人混淆的指针对象与对象本身。 这些语言包括Java的(相对于对象),Python和Ruby,JavaScript中,计划,Smalltalk的,只是仅举几例。
为了增加迷惑的是,不同语言的社区使用不同的术语。 例如,Java社区一直描述Java作为传递的价值,即使在Java对象有相同的语义在Python和Ruby对象。 然而,听到“传递的价值”在后面这些语言社区要少得多。
传址值与通按引用本质上是一个语义差别,而不是它是干什么用的一个。 但是,许多(初级)程序员不那么在乎的语义,更关心的是什么,可以用来做。 例如,有些人认为,只要你有“我有一些数据,我给一个功能,它可以改变它不还,我可以看到的变化”,这意味着通过按参考,实际上并没有思考(或关怀)关于变更的东西是否是你传递的东西,或者说这是间接地通过你的东西指向。
“通过对象传递”或或任何“通过共享通”是用来形容与具有所有值是参考(指针)沿着传递值语义的组合的术语。 以这种方式,它们可以更容易地表达这样的组合的实际效果,并从C中传递按值的影响区分开来,例如。 但语义上它仍然是传递的价值。 话说变量是“名”或“把手”是“绑定”到对象和当您分配或通过它,你分享的对象,是完全等同于说,变量(事实上,在语言的所有值)是对象的指针,当你分配或通过他们,这些指针是按值复制。
在Python变量没有价值,他们的对象引用。 当你调用一个Python函数的参数都是引用原始对象的副本。 我不知道这关系到你的问题所造成的术语。
例如,考虑下面的Python代码:
def foo(bar, baz):
bar = 3
baz[0] = 4
a = 1
b = [2]
foo(a, b)
print a, b
a
被分配给对象1
,并且b
是分配给包含所述对象的引用的列表对象2
。 内的功能的foo
, bar
也被分配到相同的对象1
和baz
被分配给相同的列表对象。 由于1
是不可变的,你不能改变对象,但可以重新分配bar
指一个不同的对象,例如3
。 列表是可修改的,因此通过设置baz[0]
至4
你也在改变列表对象b
指。 上述的输出将是1 [4]