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

时间:2014-05-22 23:42:42

标签: python python-2.7

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

2 个答案:

答案 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

虽然我怀疑你有比这更多的问题