我以为我理解了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]]
感谢。
答案 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
的官方文档