在此代码中,generate()函数由另一个函数隐式调用。
问题如下,在下面的代码中有一种方法可以确保在这种情况下调用generate()函数例如4次时,b的值保存在列表p中而不替换前面附加的元素对它来说,目前只有一个b的值被附加到t。
import random as rand
f = [1,2,3,4]
k = rand.choice(f)
h = rand.choice(f)
def generate():
global b # declare b as global
t = []
b = k + h
t.append(b) #Append b to all so that
print 'all:',t
c = 4**2
return c
generate()
def evaluate():
fit = (generate() * b) # generate() is used here
print "fit:", fit
# Some other expressions using variable b
p = []
for i in range(4):
p.append(b)
print 'p:',p
return fit
evaluate()
#output
all: [3]
fit: 48
p: [3, 3, 3, 3]
答案 0 :(得分:3)
我认为你有一个范围问题。阅读下面的链接,阅读Python中的作用域,并考虑这个例子:
>>> results = []
>>> i = [0]
>>> def test():
... i[0] = random.randint(0, 100)
... print i
... results.append(i)
...
>>> test()
[20]
>>> test()
[99]
>>> test()
[18]
>>> results
[[18], [18], [18]]
请注意,即使i[0]
的每次调用test()
的值都发生了变化,我们每次都会将相同的列表i
附加到results
- 所以当一个元素在i
更改中,更改会反映在results
列表中。
链接:
Short Description of the Scoping Rules?
https://www.inkling.com/read/learning-python-mark-lutz-4th/chapter-17/python-scope-basics
修改强>
要解决上述问题,您需要确保在每次调用test()
时都不会覆盖相同的列表。您可以通过每次创建一个新列表,或通过在修改前复制列表来实现此目的
>>> import copy
>>> def test():
... j = copy.copy(i)
... j[0] = random.randint(0, 100)
... print j
... results.append(j)
...
>>> results = []
>>> test()
[75]
>>> test()
[13]
>>> test()
[17]
>>> results
[[75], [13], [17]]
您提到您正在处理嵌套列表,在这种情况下,您应该使用copy.deepcopy
而不是copy.copy
。深层复制将复制列表中的所有元素以及列表本身。
答案 1 :(得分:1)
t
需要全球化......
粗略它只有一个元素你将它初始化为空,然后将一个项目附加到它...也只有它才能在generate函数中使用....
它还非常不清楚你想要用生成来完成什么(通常它会返回一个新的个体...)
你可以修复它以便t得到所有的b就像这样......
t = []
def generate():
global b # declare b as global
b = k + h
t.append(b) #Append b to all so that
print 'all:',t
c = 4**2
return c
虽然我怀疑你有比这更多的问题