
[英]Mandatory While Loop Gives Local Variable Might Be Referenced Before Assignment
[英]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.