变量不会在带有函数的while循环中重置

时间:2014-11-13 11:29:39

标签: python list function while-loop

我以前从未遇到过这个问题,并且想知道是否有人有解决方案。我有一个带有函数的while循环,它返回一个整数。该函数采用字符串和列表。 while循环的第一次迭代返回正确的答案,但是在后续迭代中,即使函数没有以任何方式更改列表,列表似乎也是空的。此外,如果我尝试在while循环中的函数后重置列表,新列表似乎也是空的。这似乎是非常奇怪的行为。关于最新情况的任何解释都将非常感激。循环中函数的代码很长,所以在这个阶段我会避免发布它。但是,如果有要求,我会发布。

 spectrum = [1,2,3,4,5,6]
 leaderboard = ['zzz','xxx','yyy']
 pep_scores = []
 j=0
 original_spectrum = spectrum
 print len(original_spectrum)
 while j < len(leaderboard):
      x= linear_score(leaderboard[j],spectrum)  #this function doesn't alter spectrum
      print leaderboard[j], x
      spectrum = original_spectrum     #should reset spectrum even though it shouldn't be necessary to do that
      print len(spectrum), len(original_spectrum) #prints 2 empty lists
      pep_scores.append(x) #appends correct score on 1st iteration and '0' for all others
      j=j+1

我添加了打印语句以尝试解决问题,我的原始代码未包含&#39; original_spectrum = spectrum&#39;或者&#39; spectrum = original_spectrum&#39;在while循环中。我不明白为什么经过一次迭代后,origninal_spectrum&#39;是一个空列表。我还没有发布这个功能,因为我看不出它是如何导致这个问题的。请询问您是否需要更多信息。

2 个答案:

答案 0 :(得分:1)

因为您在函数外定义spectrum且其范围是全局的,当您将spectrum作为列表名称传递给您的函数时,任何更改在它上面改变它全局而不是你的函数本地!并注意它只是可变(如列表)对象。 (注意:标签是指向特殊内存地址的指针)(您的复制命令original_spectrum = spectrum只为一个对象制作2个标签!!!

为了更好地理解,请参阅以下示例:

>>> a=[1,2,3]
>>> def f(s):
...  s.remove(1)
... 
>>> f(a)
>>> a
[2, 3]

>>> def f(s):
...  s+=[1,2]
... 
>>> f(a)
>>> a
[2, 3, 1, 2]

现在你有两个选择:

  1. 复制spectrum并将其传递给函数:
  2. copy_spectrum = spectrum[:]

    1. 在函数内部定义spectrum,在外部定义一个用于全局使用!

答案 1 :(得分:1)

要创建列表副本,请使用copy_list = original_list[:]

所以在你的例子中:

spectrum = [1,2,3,4,5,6]
leaderboard = ['zzz','xxx','yyy']
pep_scores = []
j=0
original_spectrum = spectrum[:]
print len(original_spectrum)
while j < len(leaderboard):
    x= linear_score(leaderboard[j],spectrum)  #this function doesn't alter spectrum
    print leaderboard[j], x
    spectrum = original_spectrum[:]     #should reset spectrum even though it shouldn't be necessary to do that
    print len(spectrum), len(original_spectrum) #prints 2 empty lists
    pep_scores.append(x) #appends correct score on 1st iteration and '0' for all others
    j=j+1