for in 循环中的变量赋值

时间:2021-07-07 08:45:50

标签: python-3.x for-loop variables variable-assignment for-in-loop

希望你对我们生活的这个世界一切都好...
这可能是一个非常初级的问题,但我想了解为什么会这样。

假设我有一个复杂的列表:
myList = [(1.231 +2.254j), (2.875 +23.543j), ...]

我一直在尝试使用此函数对值进行四舍五入:

def round_complex(x, digits):
    return complex(round(x.real, digits), round(x.imag, digits))

为此,我试过这个:

for item in myList:
  item = round_complex(item, 2)

期望 myList 值发生变化,例如:

myList = [(1.23 +2.25j), (2.88 +23.54j), ...]

但是,它不起作用。 我还尝试了一个更简单的例子,比如浮点数列表和 python 中的基本 round 函数。它也不起作用。
有没有办法用这种 for 循环(for-in)更改可迭代对象的值?
或者我真的必须这样做:

for i in range(len(myList)):
  myList[i] = round_complex(myList[i], 2)

2 个答案:

答案 0 :(得分:1)

简单的答案是:否。

Python 在传递函数参数时使用了一种机制,称为“对象调用”,有时也称为“对象引用调用”或“共享调用”。

<块引用>

如果您将不可变参数(如整数、字符串或元组)传递给函数,则传递的行为类似于按值调用。对象引用传递给函数参数。它们不能在函数内改变,因为它们根本不能改变,即它们是不可变的。如果我们传递可变参数,那就不同了。它们也通过对象引用传递,但它们可以在函数内就地更改。

因此,在您迭代列表之后,值 (1.231 +2.254j) 将是一个不可变参数,您的更改不会影响外部变量。但是如果你把像 [1.231 +2.254j] 这样的值传给函数,那么它会像 next 一样生效:

test.py:

myList2 = [[(1.231 +2.254j)], [(2.875 +23.543j)]]
print(myList2)
def round_complex(x, digits):
    return complex(round(x.real, digits), round(x.imag, digits))

for item2 in myList2:
    item2[0] = round_complex(item2[0], 2)

print(myList2)

执行:

$ python3 test.py
[[(1.231+2.254j)], [(2.875+23.543j)]]
[[(1.23+2.25j)], [(2.88+23.54j)]]

总之,对于你的场景,如果你坚持这样组织你的输入数据并以这种方式迭代,你就不能直接在函数内部改变外部值。

您可以参考this了解更多信息。

答案 1 :(得分:0)

通过阅读您想在 i 中分配 myList 的值的问题,我明白了这一点。为此,您可以使用 append

for i in mylist:
   mylist.append(round_complex(i, 2))
相关问题