global globalEnd
globalEnd = 0
aList = [0,globalEnd,[0,1,globalEnd]],[[],['l'],globalEnd]
for i in range(10):
globalEnd += 1
print(aList)
就像上面的代码一样,我希望列表中所有名为globalEnd的值都为10。但是它仍然打印出0
答案 0 :(得分:1)
此问题与全局变量无关。实际上,您可以删除冗余语句global globalEnd
并仍然观察到相同的结果。
问题是您没有使用行globalEnd
对globalEnd += 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名称和值的事实和神话”。
事实
事实:重新分配名称与其他名称无关。
与您的问题特别相关。如果您重新分配名称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,