是否有理由将列表分配给另一个列表并在一个列表中更改项目反映两者中的更改,但更改一个列表的整个列表并不反映两者中的更改?
a=5
b=a
a=3
print b #this prints 5
spy = [0,0,7]
agent = spy
spy[2]=8
print agent #this prints [0,0,8]
spy = [0,0,7]
agent = spy
spy = "hello"
print agent #this prints [0,0,7]
答案 0 :(得分:7)
您的第一个变异 对象,您的第二个重新绑定 名称。
(list
包含spy
} [2]=8
(名称为“间谍”)= "hello"
答案 1 :(得分:2)
如果您忘记了关于指针,地址,按值传递和通过引用传递的所有内容,并将其视为标签和对象,或名称和对象,则Python中的引用更容易理解。
按照:
a=5
b=a
a=3
print b #this prints 5
你的标签'a'放在5上,然后'b'放在同一个对象'a'上,因此5.然后'a'被移除并放上3.'b'仍然是5并移动'a'到别的东西不会影响它。
spy = [0,0,7]
你有一个名字'间谍'放在列表[0,0,7]
agent = spy
你的名字'代理'放在相同列表[0,0,7]
spy[2]=8
print agent #this prints [0,0,8]
您将列表中的索引2标签放在8上。由于agent和spy都是同一列表的名称,因此在打印时您会看到两者的变化。
spy = [0,0,7]
您在列表[0,0,7]
上有名字'间谍'agent = spy
您在相同列表[0,0,7]
上有名称'代理'spy = "hello"
现在你从列表中删除了名称'spy',然后输入一个字符串“hello”。该列表仍然为其分配了“代理”标签。
print agent #this prints [0,0,7]
知道了吗?
答案 2 :(得分:1)
将一个列表的列表分配给另一个变量时,两者都属于同一个列表。
spy = [0,0,7]
agent = spy
spy[2]=8
这就是为什么你改变spy所以代理也被改变了,因为它们都属于同一个内存位置上的相同列表。你可以检查一下
id(spy)
id(agent)
这是通过引用进行的呼叫。
但是如果在初始化代理后将新列表分配给间谍,那么间谍就属于另一个内存位置上的另一个列表。
id(spy)
id(agent)
您也可以使用id()函数进行检查,该函数在内存中提供变量的引用ID。