如何在python中获取全局变量以在列表中工作?

时间:2018-09-08 12:38:34

标签: python list global-variables

global globalEnd
globalEnd = 0

aList = [0,globalEnd,[0,1,globalEnd]],[[],['l'],globalEnd]

for i in range(10):
   globalEnd += 1
   print(aList)

就像上面的代码一样,我希望列表中所有名为globalEnd的值都为10。但是它仍然打印出0

2 个答案:

答案 0 :(得分:1)

此问题与全局变量无关。实际上,您可以删除冗余语句global globalEnd并仍然观察到相同的结果。

问题是您没有使用行globalEndglobalEnd += 1进行突变。您正在构建一个值为globalEnd + 1的新整数,并将名称globalEnd重新分配给该值。

aList不会被突变,因为它仍然保留着对globalEnd原始值的引用。

由于无法更改整数值,因此您将必须直接更改aList或构建新列表并重新分配名称aList。我建议第二种选择。

演示:

>>> globalEnd = 0
>>> 
>>> aList = [0,globalEnd,[0,1,globalEnd]],[[],['l'],globalEnd]
>>> 
>>> print(aList)
([0, 0, [0, 1, 0]], [[], ['l'], 0])
>>> 
>>> for i in range(10):
...     globalEnd += 1
...     aList = [0,globalEnd,[0,1,globalEnd]],[[],['l'],globalEnd]
...     print(aList)
... 
([0, 1, [0, 1, 1]], [[], ['l'], 1])
([0, 2, [0, 1, 2]], [[], ['l'], 2])
([0, 3, [0, 1, 3]], [[], ['l'], 3])
([0, 4, [0, 1, 4]], [[], ['l'], 4])
([0, 5, [0, 1, 5]], [[], ['l'], 5])
([0, 6, [0, 1, 6]], [[], ['l'], 6])
([0, 7, [0, 1, 7]], [[], ['l'], 7])
([0, 8, [0, 1, 8]], [[], ['l'], 8])
([0, 9, [0, 1, 9]], [[], ['l'], 9])
([0, 10, [0, 1, 10]], [[], ['l'], 10])

我非常推荐Ned Batchelder的演讲“关于Python名称和值的事实和神话”。

Youtube video
Article

事实

  

事实:重新分配名称与其他名称无关。

与您的问题特别相关。如果您重新分配名称globalEnd,则aList中指向原始值的引用将不在乎。

答案 1 :(得分:-1)

您可以使用object,如果它的任何属性被更新,它将被更新-

global n

class node:
    age = 0

    # The returned value is printed whenever you print the object of this class
    def __str__(self):
        return str(self.age)

def print_list(l):
    ind = 0
    while(ind < len(l)):
        if(type(l[ind]) is list):
            print_list(l[ind])
        else:
            print(l[ind], end=", ")
        ind = ind+1

def main():
    global n
    n = node()
    lst = [0, n, [n, 0]]

    print("initially : ")
    print_list(lst)
    print("\n")

    # Modify the age
    count = 0
    while(count < 10):
        n.age=n.age+1
        count = count+1

    # See if it gets updated
    print("post update: ")
    print_list(lst)
    print("\n")

main()

输出:

initially :
0, 0, 0, 0,

post update:
0, 10, 10, 0,