在Python中传递值
这个问题在这里已经有了答案:
Python通过值传递引用到对象。
Python通过值传递引用到对象(如Java),而Python中的所有东西都是一个对象。 这听起来很简单,但您会注意到某些数据类型似乎具有传递值特性,而其他数据类似于传递引用......这是怎么回事?
理解可变对象和不可变对象很重要。 一些对象,如字符串,元组和数字是不可变的。 在函数/方法内改变它们会创建一个新的实例,并且函数/方法之外的原始实例不会改变。 其他对象,如列表和字典是可变的,这意味着你可以在原地更改对象。 因此,改变函数/方法内的对象也会改变原始对象的外部。
事情是,整个参考/价值概念不适合python。 Python没有变量的“价值”。 Python只有引用对象的对象和名称。
所以当你调用一个函数并在括号内放置一个“名字”时,就像这样:
def func(x): # defines a function that takes an argument
... # do something here
func(myname) # calling the function
myname
指向的实际对象被传递,而不是名称 myname
本身 。 在函数内部给出另一个名字 ( x
)来引用传递的同一个对象。
如果函数是可变的,您可以修改函数内的对象,但不能更改外部名称指向的内容 。 就像你做这件事一样
anothername = myname
因此我可以用以下答案回答你的问题
它是“按值传递”,但所有值都只是对象的引用。
这里的答案很有帮助,但是我发现需要展现我未见过的这种美好的区别,我已经通过随后的CL实验证明了这一点:
'num'在这里没有改变,因为它是一个不可变的Number对象[支持我的要点1]:
def incr_num(num):
num += 1
num = 0
num
0
incr_num(num)
num
0
'list [0]'这里也是一个不可变的Number对象。
def incr_list(list):
list[0] += 1
list = [0]
list[0]
0
incr_list(list)
list[0]
1
那么作为一个不可变的Number对象的'list [0]'是如何改变的(支持我的第2点),而上面的例子的Number对象'num'没有改变? 不可变的Number对象'list [0]'包含在可变列表对象'list'中,而来自第一个例子的'num'只是一个不确定的Number对象。
虽然意图很好,但我觉得@Stephen Pape评价最高的答案(以下引用)和其他一些类似的答案并不完全正确(并且这促使我写这个答案):
一些对象,如字符串,元组和数字是不可变的。 在函数/方法内改变它们会创建一个新的实例,并且函数/方法之外的原始实例不会改变。
我上面的第二个代码实验显示了一个Number对象('list [0]')在一个方法中被改变,然后原来的函数改变了。
链接地址: http://www.djcxy.com/p/3537.html下一篇: Where is the mutability of Objects defined in ECMAScript?