我偶然发现了python的一个奇怪的行为"(对我来说很奇怪)。我以为我创造了一个 列表" a"传递ParamList的第一个元素,这是一个列表。 然后我改变了#34; a"在另一个函数中,但ParamList [0]也被改变了。我没想到。
查看以下最小代码
def f(ParamList):
b = ParamList[1]
a = ParamList[0]
print('id(ParamList[0]), id(a)', id(ParamList[0]), id(a))
a, b = Problemmaker(a,b)
print('a, b, ParamList', a, b, ParamList)
def Problemmaker(a,b):
a[2]=99
print('id(a)', id(a))
b = 55
return a,b
if __name__ == "__main__":
Initial = [[2,3,4],2]
f(Initial)
答案 0 :(得分:0)
我已经发现了什么,问题是什么。
显然,我所做的就是那个 ""和ParamList [0]引用相同的地址。
所以我在想,#34; a"获取ParamList [0]的值,但事实上,我所做的只是 引用" a"到同一个地址。因此,当我改变" a"时,存储在该地址中的值也发生了变化,因此获得了ParamList [0]。
所以如果我不想改变" a"但不是ParamList [0],我可以为" a"创建一个新列表。并且避免了这个问题。
def f(ParamList):
b = ParamList[1]
a = [*ParamList[0]]
print('id(ParamList[0]), id(a)', id(ParamList[0]), id(a))
a, b = Problemmaker(a,b)
print('a, b, ParamList', a, b, ParamList)
def Problemmaker(a,b):
a[2]=99
print('id(ParamList[0]), id(a)', id(a))
b = 55
return a,b
if __name__ == "__main__":
Initial = [[2,3,4],2]
f(Initial)
这是令人尴尬的,因为我在python中编码很长时间知道而且我是 一直以为我知道什么是什么,但是承认这个错误希望让我更加细致。