Python 对象混淆
Python by-object confusion
重复编辑: 还有一个 question 被标记为相似,但它是不同的,因为它只讨论 .append 和完整列表实例化。我的问题是关于偏移赋值 (data[j]) 和迭代器(在第一个函数中使用)。
我对 Python 按对象信息传递有点困惑。在我的教科书中,当函数接收到它的参数时,它会为初始对象创建一个别名。另外,关于可变参数:"we note that reassigning a new value to a formal parameter, such as by setting list = [ ], does not alter the actual parameter; such reassignment breaks the alias".
现在我有这两个功能了:
def mult(data, factor):
for val in data:
val *= factor
data = [i for i in range(5)]
mult(data, 3)
print(data)
def mult2(data, factor):
for j in range(len(data)):
data[j] *= factor
data = [i for i in range(5)]
mult2(data, 3)
print(data)
这将分别产生输出 0,1,2,3,4 和 0,3,6,9,12。
在 mult2 中,我们通过重新分配一个新值来更改数据的值。为什么别名没有被破坏?
此外,在第一个函数中,如果我遍历列表的每个值并更改它,别名是否损坏?
for val in data:
val *= factor
您正在重新分配 val,因此它的 "link" 数据已损坏
for j in range(len(data)):
data[j] *= factor
您正在使用来自数据的 "offset",因此 "link" 不会损坏
重复编辑: 还有一个 question 被标记为相似,但它是不同的,因为它只讨论 .append 和完整列表实例化。我的问题是关于偏移赋值 (data[j]) 和迭代器(在第一个函数中使用)。
我对 Python 按对象信息传递有点困惑。在我的教科书中,当函数接收到它的参数时,它会为初始对象创建一个别名。另外,关于可变参数:"we note that reassigning a new value to a formal parameter, such as by setting list = [ ], does not alter the actual parameter; such reassignment breaks the alias".
现在我有这两个功能了:
def mult(data, factor):
for val in data:
val *= factor
data = [i for i in range(5)]
mult(data, 3)
print(data)
def mult2(data, factor):
for j in range(len(data)):
data[j] *= factor
data = [i for i in range(5)]
mult2(data, 3)
print(data)
这将分别产生输出 0,1,2,3,4 和 0,3,6,9,12。
在 mult2 中,我们通过重新分配一个新值来更改数据的值。为什么别名没有被破坏?
此外,在第一个函数中,如果我遍历列表的每个值并更改它,别名是否损坏?
for val in data:
val *= factor
您正在重新分配 val,因此它的 "link" 数据已损坏
for j in range(len(data)):
data[j] *= factor
您正在使用来自数据的 "offset",因此 "link" 不会损坏