List 如何在多个列表中更新变量(Python 3.6)
我有一个范围问题,我知道如何用Java解决这个问题,但Python给了我一些问题。假设我有如下代码:List 如何在多个列表中更新变量(Python 3.6),list,python-3.x,scope,List,Python 3.x,Scope,我有一个范围问题,我知道如何用Java解决这个问题,但Python给了我一些问题。假设我有如下代码: a = 1 b = 2 c = 3 list1 = [a,b,c] list2 = [b,c] b += 1 print list1 print list2 这段代码不会改变列表中的值,对于我给出的简单示例,有一个简单的解决方法,但我尝试编写的代码有10多个列表,它们都有不同的含义,使用方式也不同,但需要相互通信,并且a、b、c的值都相同。我需要能够更改变量a、b、c并更新所有列表,除了
a = 1
b = 2
c = 3
list1 = [a,b,c]
list2 = [b,c]
b += 1
print list1
print list2
这段代码不会改变列表中的值,对于我给出的简单示例,有一个简单的解决方法,但我尝试编写的代码有10多个列表,它们都有不同的含义,使用方式也不同,但需要相互通信,并且a、b、c的值都相同。我需要能够更改变量a、b、c并更新所有列表,除了为每个列表写入更新外,还有其他方法吗?不能通过引用存储整数,因此在一个位置增加值会导致更新所有其他值。这是因为
int
s是不可变的,因此更改其值会导致引用更改
>>> a = 5
>>> b = 1
>>> x = [a, b]
>>> id(b)
140508116572264
>>> id(x[1])
140508116572264
>>> b += 1
>>> id(b)
140508116572240
您可以看到b
的id
在增量之后发生变化,因此循环中的“b”和循环外部的“b”不一样
您可以做的是为int
s定义一个包装器类
class MyInteger:
def __init__(self, value):
self.value = value
现在,使用您的MyInteger
s构建您的列表:
a = MyInteger(1)
b = MyInteger(2)
c = MyInteger(3)
list1 = [a, b, c]
list2 = [b, c]
现在,当您增加b
的值时,您可以看到更改反映在列表中
print([x.value for x in list1])
b.value += 1
print([x.value for x in list1])
这张照片是:
[1, 2, 3]
[1, 3, 3]
列表可能不是您想要的数据结构。好的,字典,对于这个,什么结构更好?我可以使用numpy阵列,但我认为如果没有关于您的用例的更多信息,这将无法解决我遇到的“范围”问题,很难说。太棒了!这应该是一个相对简单的解决方法。这么简单的问题,如果我改变列表的值,比如list1[1]+=1,它会在任何地方改变它吗?如果不是的话,像:for i in list1:i+=1这样的结构会起作用吗?
list1[1]。value+=1
,是的。会的i.value+=1
也有效,因为它们引用相同的自定义对象。@DylanBarth:干杯。考虑一下你是否心情愉快。谢谢,我是新来的。在你做的那个类上,我得到了一个错误“未定义的名称‘self’”和“未定义的名称‘value’”,我通常不手工创建独立的类,这是一个可接受的错误还是我遗漏了什么?复制和粘贴而不是键入我看到的内容,它修复了它,也许“uuuuuu”是一个问题,我想我可能键入了一个而不是两个。谢谢你的帮助,错误消失了,答案被接受了,感谢时间。干杯