繁体   English   中英

for in 循环中的变量赋值

[英]Variable assignment inside for in loop

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

假设我有一个复杂的列表:
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)

简单回答是不。

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

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

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

测试.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)]]

总之,对于您的情况,如果您坚持将输入数据组织成那样并以这种方式进行迭代,则无法直接在函数内部更改外部值。

你可以参考这个来了解更多。

我通过阅读您想在myList分配i的值的问题来理解这一点。 为此,您可以使用append ie

for i in mylist:
   mylist.append(round_complex(i, 2))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM