【问题标题】:Python: overwrite two variablesPython:覆盖两个变量
【发布时间】:2014-01-19 16:20:50
【问题描述】:

在我使用 python 的过程中,我遇到了一个阻塞问题。我有 SomeFunction 应该对给定的整数向量进行一些简单的计算(并对它进行排序-我删除了那段代码以使其更清晰)并返回新的向量。 主要问题是,每个内部循环的结果必须成为下一个循环的输入,但变量 k 和 X 似乎在内存中具有相同的地址。

函数如下所示:

def SomeFunction(k, N):
    X = range(N);
    for i in range(N):
        for j in range(3):
            X[i] = k[i]*2;
        print "X:";
        print X;
        print "k -> :";
        print k
        k = X;
        print "============================";
    return k;

它会产生输出:

X: [0, 1, 2, 3, 4, 5, 6, 7] k -> : [0, 1, 2, 3, 4, 5, 6, 7] ============================== X: [0, 8, 2, 3, 4, 5, 6, 7] k -> : [0, 8, 2, 3, 4, 5, 6, 7] ==============================

第一个循环的输出没问题,因为第一个元素是 0,但是对于其余的循环,你可以看到问题。 X 应该有新的值,而 k 应该是相同的。有谁知道如何解决这个问题?

【问题讨论】:

  • python 不需要';'作为行终止符
  • 老实说,我很难将其视为重复。有不止几个问题的答案和潜在问题与这个问题相同。但我不确定是否应该以同样的方式考虑问题或问题,即使答案是。

标签: python sorting variables overwrite


【解决方案1】:

当你说

k = X;

您不是将X 的副本创建到k,而是使Xk 指向同一个列表。您可以像这样创建列表的副本

k = X[:]

注意:Python 不希望 ; 在行尾。

【讨论】:

    【解决方案2】:

    我不确定这是否应该作为答案或评论发布,但这完全涵盖了您的问题:python list by value not by reference

    我决定回答一个解释。

    Python 在这种情况下默认使用引用。所以你是对的,Xk 本质上指向列表的同一个实例。您想要的是制作内容的深层副本。

    【讨论】:

      【解决方案3】:

      您可以使用切片表示法将数组内容复制到另一个,同时保留列表 ID:

      k[:] = X[:]
      

      【讨论】:

        【解决方案4】:

        试试这个:

        def SomeFunction(k = range(8),N=8):
            X = range(N)
            for i in range(N):
                for j in range(3):
                    X[i] = k[i]*2
                print "X:"
                print X
                print "k -> :"
                print k
                k = X[:]
                print("============================")
            return k
        
        SomeFunction()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-28
          • 1970-01-01
          • 2018-09-27
          • 2017-02-25
          • 2021-08-24
          相关资源
          最近更新 更多