【问题标题】:While loop incorrectly updating the variables [duplicate]虽然循环错误地更新了变量[重复]
【发布时间】:2022-02-04 00:13:24
【问题描述】:

我的 python 代码中有一个 while 循环,其中包含一个嵌套的 for 循环,该循环遍历二维数组。 变量T 需要在while 循环结束时更新。 但是,我看到该变量在 for 循环本身内得到更新。 我在这里做错了什么以及如何修改它?

error = 1
tolerance = 1e-6
T = T_new
itr = 0
while error>tolerance:
    itr = itr+1
    for i in range(1,imax-1):
        for j in range(1,jmax-1):
            T_new[i,j]=0.25*(T[i-1,j]+T[i+1,j]+T[i,j-1]+T[i,j+1])
    error = np.max(np.abs(T_new-T))
    T = T_new

【问题讨论】:

  • T = T_new 不会复制 T_New,如果您是这样想的话。
  • 由于我在while循环中,我想用T计算T_new。然后用T_new更新T并重新计算直到满足条件。
  • 这是导致问题的T(在循环之前)的第一个分配。您需要T_NewT独立,以便在循环的最后一行中(正确)将T 替换为T_new 之前计算T_new - T。跨度>
  • T 和 T_new 是同一个对象的名称。赋值不会复制,它会为一个对象命名。试试a=[1]; b=a; a[0]=2 然后print(b)
  • 欢迎来到 Stack Overflow。 “然后用 T_new 更新 T” 仔细想想“更新”是什么意思。您大概希望T 成为具有相同值不同对象。在 Python 中,= 无法做到这一点,无论数据类型是什么。在 Python 中,= 使左侧引用 与右侧相同的对象。请参阅链接副本,以及nedbatchelder.com/text/names1.html作为补充阅读。

标签: python for-loop while-loop


【解决方案1】:

在 python 中,只有原语:整数、浮点数、字符串是按值复制的。默认情况下,列表、字典和对象是通过引用复制的。

您可以from copy import deepcopy 并使用T = deepcopy(T_new) 来获得您想要的行为。不过,在这样做之前,请考虑一下您是否正在以最佳方式编写代码。例如,您使用itr = itr + 1 而不是itr += 1。还要考虑格式化。如果您无法正确编写代码,请使用自动格式化程序。

【讨论】:

  • 不,一切都以同样的方式对待。不可变对象就是无法更改。关于如何处理分配,整数浮点数和字符串没有什么特别之处
  • 除了技术上不正确之外,该问题是一个常见问题,已通过重复充分解决,因此不应在此回答。同样,对原始代码格式等的观察也不属于答案,因为它们充其量是与问题相切的。如果您以前没有,请阅读How to Answer
  • @KarlKnechtel,还不错吧?该问题已关闭到错误的问题。只有最初的可变性问题提到了 deepcopy,尽管不是立即。
  • 重点是理解底层语义。此外,深拷贝在这里可能不相关; OP 没有提到它,但代码语法强烈建议使用 Numpy 数组。无论如何,数据结构只被索引一次,因此没有理由预期浅拷贝会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2013-08-22
  • 2017-11-16
  • 1970-01-01
相关资源
最近更新 更多