python循环函数怎么改变变量_关于python:变量不在while循环中用函数重置

我以前从未遇到过这种情况,我想知道是否有人能找到解决办法。我有一个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

我添加了print语句来解决这个问题,我的原始代码在while循环中没有包含"original_spectrum=spectrum"或"spectrum=original_spectrum"。我不明白为什么一次迭代后,"原始光谱"是一个空列表。我没有发布函数,因为我看不到它是如何导致问题的。请询问您是否需要更多信息。

original_spectrum = spectrum不创建副本。你确定linear_score不会改变它的论点吗?如果没有一个完整的最小例子,就很难提供帮助。

谢谢,当我在循环前将原始光谱打印到屏幕上时,它与光谱完全相同?如果不是这样,我将如何创建副本。我100%确信函数不会改变其参数。很抱歉,只发布了很少的内容,但该函数很长,并且包含其他几个也很长的嵌套函数。

见stackoverflow.com/q/2612802/3001761。如果你的代码很长,你应该把它减少到引起问题的最小部分——这将帮助你在不需要询问的情况下找到错误。

可能重复的python引用

要创建列表的副本,请使用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

太好了,看来已经修好了。

因为您在函数外部定义了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]

现在您有两种选择:

制作一份spectrum的副本,并将其传递给函数:

copy_spectrum = spectrum[:]

在函数内部定义spectrum,在全局使用中定义一个spectrum!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值