【发布时间】:2013-09-05 17:14:19
【问题描述】:
我以为我理解了 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]]
谢谢。
【问题讨论】:
-
那篇文章是错误的...Python 基本上被认为是按值传递,其中所有值都是引用(因为命名空间中的每个名称都只是指向某个对象的指针)。
-
@ShashankGupta:这篇文章是对的。 “所有值都是引用的按值传递”只是相同语义的 Java 术语。
-
链接的文章最有趣的地方在于,它是少数几个评论区之一,其中顶级 cmets 是正确的,并且更正了作者。
-
值得注意的是,如果您使用索引来写入行,您的“逐行”版本可以工作:
for i, row in enumerate(b): b[i] = [float(x) for x in row]。结果将与“逐个元素”版本几乎相同,尽管它会创建新的内部列表而不是重用旧的。
标签: python python-2.7