python pass-by-value与pass-by-reference

时间:2013-09-05 17:14:19

标签: python python-2.7

我以为我理解了python的传递引用处理...为什么列表的传递引用与列表元素的传递之间存在差异,特别是如果两者都是对象的话理解它:

 dataBloc = [ ['123'] , ['345'] ]

 print dataBloc

 def func( b ):
     print ( 'Row-by-Row Before' , b )
     for row in b:
         row = [ float(x) for x in row ]
     print ( 'Row-by-Row After' , b )

     print ( 'Element-by-Element Before' , b )
     for row in b:
         for i in range(len(row)):
             row[i] = float(row[i])
     print ( 'Element-by-Element After' , b )

     return b

 print func(dataBloc)

 [['123'], ['345']]
 ('Row-by-Row Before', [['123'], ['345']])
 ('Row-by-Row After', [['123'], ['345']])
 ('Element-by-Element Before', [['123'], ['345']])
 ('Element-by-Element After', [[123.0], [345.0]])
 [[123.0], [345.0]]

感谢。

3 个答案:

答案 0 :(得分:2)

首先,这个问题与传值或传递引用无关,因为你没有做任何传递,你只是在一个函数中改变值。

其次,没有这种差异。不同之处在于您的代码:您正在做不同的事情。在第一个循环中,将列表中的每个元素分配给名称“row”。然后,您重新分配名称'row'以指向其他内容。以前在'row'中的实际值没有变化,因此当然原始列表本身没有变化,因为您实际上没有更改内容。

在第二行中,每行内部通过索引专门改变每个元素的内容。因此,列表已更改。

答案 1 :(得分:0)

  

我以为我理解了python的pass-by-reference处理...为什么列表的传递引用与列表元素的传递之间存在差异,特别是如果两者都是我理解的对象:< / p>

Python是按值调用,而不是按引用调用。请参阅evaluation strategies上的维基百科页面。

正如@ShashankGupta总结:“Python基本上被认为是值为值的值,其中所有值都是引用(因为命名空间中的每个名称只是指向某个对象的指针)。” python有一些神奇的其他评估策略的观点是python社区的小子集的视图,他们希望python是神奇而独特的。 Python处理对象+ call-by-reference的方式甚至不是唯一的,并且存在于(至少)Java,Smalltalk和Ruby中。

此外,除了传递databloc之外,您的代码不会显示任何调用/传递。

答案 2 :(得分:-1)

Python中没有pass-by-reference或pass-by-value(除了实现细节 - 我在谈论语言属性)。这种分类根本不适用于Python。所有的对象都有类型,标识(哈希)和数据(值)。

对象之间的唯一区别是它们的数据是可变不可变。我建议阅读有关Python data model

的官方文档