gpt4 book ai didi

python - 附加到隐式调用的函数中的列表

转载 作者:行者123 更新时间:2023-11-28 22:49:31 24 4
gpt4 key购买 nike

在此代码中,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]

最佳答案

我认为您遇到了范围问题。使用以下链接阅读 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]]

请注意,即使每次调用 test()i[0] 的值都会发生变化,我们还是会附加相同的列表 i 每次都返回 results - 所以当 i 中的元素发生变化时,这些变化会反射(reflect)在整个 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。深拷贝将复制列表中的所有元素以及列表本身。

关于python - 附加到隐式调用的函数中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23818844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com